From 7d8c226da2a7fffef70b5d715dda0e138a9aa9c0 Mon Sep 17 00:00:00 2001 From: RubenRWU Date: Thu, 15 Oct 2026 15:30:26 +0200 Subject: [PATCH] Onyscribe Admin: Initialer Stand MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Admin-Plattform für die Tenants von Onyscribe: Editor mit Live-Vorschau (echter Core in Sandbox), Versionen, KI-Agent (Cortecs), OIDC-Abgleich über die Login-Developer-API, Deploy-Engine (Mittwald, gesperrt ohne DEPLOY_LIVE, Freigabe pro Tenant), Core-Vertrag (Schema/Manifest), Core-Releases mit Kompatibilitätsprüfung, Canary-Rollout und Rollback, Zustandsabgleich. Runbook: docs/RUNBOOK_PARALLELTEST.md Co-Authored-By: Claude Sonnet 5.5 --- .dockerignore | 6 + .env.example | 30 + .gitignore | 9 + Dockerfile | 21 + Dockerfile.fromcore | 24 + README.md | 141 + app/__init__.py | 0 app/agent/__init__.py | 0 app/agent/backends.py | 129 + app/agent/loop.py | 175 ++ app/agent/testrun.py | 24 + app/agent/tools.py | 110 + app/agent/workspace.py | 106 + app/auth.py | 162 ++ app/db.py | 42 + app/deps.py | 19 + app/main.py | 42 + app/models.py | 149 + app/routers/__init__.py | 0 app/routers/api.py | 770 +++++ app/routers/pages.py | 107 + app/services/__init__.py | 0 app/services/contract.py | 125 + app/services/crypto.py | 15 + app/services/defaults.py | 44 + app/services/deploy.py | 314 +++ app/services/guard.py | 35 + app/services/importer.py | 151 + app/services/llm.py | 121 + app/services/mittwald.py | 159 ++ app/services/onyva_login.py | 312 ++ app/services/preflight.py | 114 + app/services/preview.py | 109 + app/services/preview_worker.py | 65 + app/services/releases.py | 254 ++ app/services/samples.py | 76 + app/services/seed.py | 54 + app/services/status.py | 61 + app/services/store.py | 225 ++ app/services/tenants.py | 95 + app/settings.py | 33 + app/static/admin.css | 170 ++ app/static/tenant.js | 598 ++++ app/templates/audit.html | 13 + app/templates/base.html | 44 + app/templates/core.html | 90 + app/templates/dashboard.html | 123 + app/templates/deployments.html | 31 + app/templates/settings.html | 133 + app/templates/tenant.html | 51 + app/templating.py | 32 + docker-compose.override.yml | 6 + docker-compose.yml | 63 + docs/RUNBOOK_PARALLELTEST.md | 289 ++ requirements-extra.txt | 8 + requirements.txt | 18 + scripts/export_seed.py | 14 + scripts/fake_login_server.py | 42 + scripts/import_tenants.py | 27 + scripts/sync_core.sh | 13 + scripts/verify_import.py | 39 + seed/tenants.seed.json.gz | Bin 0 -> 986548 bytes tests/__init__.py | 0 tests/conftest.py | 22 + tests/fakelogin.py | 59 + tests/test_core_contract.py | 443 +++ tests/test_flow.py | 529 ++++ vendor/platform/CORE_VERSION | 1 + vendor/platform/core/BUILD_INFO.json | 1 + vendor/platform/core/__init__.py | 0 vendor/platform/core/app.py | 1637 +++++++++++ vendor/platform/core/bundle.py | 178 ++ vendor/platform/core/config.py | 154 + vendor/platform/core/contract.py | 111 + vendor/platform/core/cost.py | 146 + vendor/platform/core/defaults/prompt.txt | 142 + vendor/platform/core/docx_export.py | 238 ++ vendor/platform/core/hooks.py | 64 + vendor/platform/core/pdf/__init__.py | 4 + vendor/platform/core/pdf/context.py | 92 + vendor/platform/core/pdf/render.py | 33 + vendor/platform/core/protocol.py | 160 ++ vendor/platform/core/retry.py | 100 + .../platform/core/schema/tenant_schema.json | 928 ++++++ .../core/templates/index.template.html | 2505 +++++++++++++++++ vendor/platform/core/templates/protocol.css | 112 + vendor/platform/core/templates/protocol.html | 59 + vendor/platform/main.py | 12 + vendor/platform/requirements.txt | 13 + 89 files changed, 13975 insertions(+) create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Dockerfile.fromcore create mode 100644 README.md create mode 100644 app/__init__.py create mode 100644 app/agent/__init__.py create mode 100644 app/agent/backends.py create mode 100644 app/agent/loop.py create mode 100644 app/agent/testrun.py create mode 100644 app/agent/tools.py create mode 100644 app/agent/workspace.py create mode 100644 app/auth.py create mode 100644 app/db.py create mode 100644 app/deps.py create mode 100644 app/main.py create mode 100644 app/models.py create mode 100644 app/routers/__init__.py create mode 100644 app/routers/api.py create mode 100644 app/routers/pages.py create mode 100644 app/services/__init__.py create mode 100644 app/services/contract.py create mode 100644 app/services/crypto.py create mode 100644 app/services/defaults.py create mode 100644 app/services/deploy.py create mode 100644 app/services/guard.py create mode 100644 app/services/importer.py create mode 100644 app/services/llm.py create mode 100644 app/services/mittwald.py create mode 100644 app/services/onyva_login.py create mode 100644 app/services/preflight.py create mode 100644 app/services/preview.py create mode 100644 app/services/preview_worker.py create mode 100644 app/services/releases.py create mode 100644 app/services/samples.py create mode 100644 app/services/seed.py create mode 100644 app/services/status.py create mode 100644 app/services/store.py create mode 100644 app/services/tenants.py create mode 100644 app/settings.py create mode 100644 app/static/admin.css create mode 100644 app/static/tenant.js create mode 100644 app/templates/audit.html create mode 100644 app/templates/base.html create mode 100644 app/templates/core.html create mode 100644 app/templates/dashboard.html create mode 100644 app/templates/deployments.html create mode 100644 app/templates/settings.html create mode 100644 app/templates/tenant.html create mode 100644 app/templating.py create mode 100644 docker-compose.override.yml create mode 100644 docker-compose.yml create mode 100644 docs/RUNBOOK_PARALLELTEST.md create mode 100644 requirements-extra.txt create mode 100644 requirements.txt create mode 100644 scripts/export_seed.py create mode 100644 scripts/fake_login_server.py create mode 100644 scripts/import_tenants.py create mode 100755 scripts/sync_core.sh create mode 100644 scripts/verify_import.py create mode 100644 seed/tenants.seed.json.gz create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/fakelogin.py create mode 100644 tests/test_core_contract.py create mode 100644 tests/test_flow.py create mode 100644 vendor/platform/CORE_VERSION create mode 100644 vendor/platform/core/BUILD_INFO.json create mode 100644 vendor/platform/core/__init__.py create mode 100644 vendor/platform/core/app.py create mode 100644 vendor/platform/core/bundle.py create mode 100644 vendor/platform/core/config.py create mode 100644 vendor/platform/core/contract.py create mode 100644 vendor/platform/core/cost.py create mode 100644 vendor/platform/core/defaults/prompt.txt create mode 100644 vendor/platform/core/docx_export.py create mode 100644 vendor/platform/core/hooks.py create mode 100644 vendor/platform/core/pdf/__init__.py create mode 100644 vendor/platform/core/pdf/context.py create mode 100644 vendor/platform/core/pdf/render.py create mode 100644 vendor/platform/core/protocol.py create mode 100644 vendor/platform/core/retry.py create mode 100644 vendor/platform/core/schema/tenant_schema.json create mode 100644 vendor/platform/core/templates/index.template.html create mode 100644 vendor/platform/core/templates/protocol.css create mode 100644 vendor/platform/core/templates/protocol.html create mode 100644 vendor/platform/main.py create mode 100644 vendor/platform/requirements.txt diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..eba7c53 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,6 @@ +.venv +.git +.data +.preview-cache +__pycache__ +tests diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..78a90d3 --- /dev/null +++ b/.env.example @@ -0,0 +1,30 @@ +# ── Pflicht ─────────────────────────────────────────────────────────────────── +# Datenbank: Postgres (docker-compose setzt sie selbst) oder SQLite für lokale Entwicklung +DATABASE_URL=sqlite:///./.data/onyscribe-admin.db +# Master-Key für Secrets in der DB UND Session-Cookies (Fernet-Key). SICHERN – ohne ihn sind Secrets unlesbar. +# python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" +SECRET_KEY= + +# ── Login der Admin-Plattform (login.onyva.dev) ─────────────────────────────── +AUTH_ENABLED=false +OIDC_ISSUER=https://login.onyva.dev +OIDC_CLIENT_ID= +OIDC_CLIENT_SECRET= +OIDC_REDIRECT_URI=https://admin.example.de/auth/callback +OIDC_LOGOUT_REDIRECT_URI=https://admin.example.de/ +APP_COOKIE_SECURE=true +# Zugriffsregel (mindestens eine, sonst Default-Deny): +ADMIN_ALLOWED_EMAILS= +ADMIN_REQUIRED_ROLE= + +# ── Deploys ─────────────────────────────────────────────────────────────────── +DEPLOY_ALLOWED_TENANTS= # Tenants, die LIVE angefasst werden dürfen (kommagetrennt, * = alle, leer = keiner) – zum Start nur den Test-Tenant, z. B. demo-admin +DEPLOY_LIVE=false # true erlaubt ECHTE Schreibzugriffe auf Mittwald – bewusst aus lassen, bis der Core umgebaut ist +MITTWALD_API_TOKEN= # optional für lesende Dry-Run-Aufrufe + +# ── OIDC-Clients der Tenants automatisch verwalten (login.onyva.dev /api/v1) ── +ONYVA_LOGIN_API_KEY= # Admin-Key aus dem Login-Dashboard (API-Keys); wie ein Passwort behandeln +OIDC_SYNC_LIVE=false # true = darf im Login Apps anlegen/ändern; ohne: nur lesen/Plan (Dry-Run) + +# ── KI ──────────────────────────────────────────────────────────────────────── +CORTECS_API_KEY= # alternativ: Einstellungen → Geteilte Secrets diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c4e2a81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.venv/ +__pycache__/ +*.pyc +.env +*.db +.preview-cache/ +.data/ +.idea/ +.gstack/ diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..de5fb8d --- /dev/null +++ b/Dockerfile @@ -0,0 +1,21 @@ +FROM python:3.12-slim + +# WeasyPrint (PDF-Vorschau) + Fonts – identisch zum Core-Image der Plattform +RUN apt-get update && apt-get install -y --no-install-recommends \ + libpango-1.0-0 libpangoft2-1.0-0 libharfbuzz0b libffi8 \ + fonts-noto-core fonts-noto-color-emoji fonts-liberation \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /srv +COPY requirements.txt . +RUN pip install --no-cache-dir -r requirements.txt + +COPY app ./app +COPY vendor ./vendor +COPY seed ./seed +COPY scripts ./scripts + +ENV PORT=8300 PYTHONUNBUFFERED=1 +EXPOSE 8300 +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s CMD python -c "import urllib.request,os;urllib.request.urlopen('http://127.0.0.1:'+os.environ.get('PORT','8300')+'/healthz')" +CMD ["sh", "-c", "uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8300} --proxy-headers --forwarded-allow-ips='*'"] diff --git a/Dockerfile.fromcore b/Dockerfile.fromcore new file mode 100644 index 0000000..a7782c3 --- /dev/null +++ b/Dockerfile.fromcore @@ -0,0 +1,24 @@ +# Admin-Image auf Basis des Core-Images: Sandbox-Vorschau, Schriften, Python-Pakete und WeasyPrint sind +# damit PER KONSTRUKTION identisch zur Produktion, und der Core-Vertrag (Schema, Manifest) kommt direkt aus dem Image. +# +# docker build -f Dockerfile.fromcore --build-arg CORE_IMAGE=/transkript-platform: -t onyscribe-admin . +# +# Coolify: ADMIN_DOCKERFILE=Dockerfile.fromcore, CORE_IMAGE=/transkript-platform:. +# Läuft der Admin auf einem anderen Core als ein gemeldetes Release, zeigt „Core“ das an und lässt keine Prüfung/Freigabe zu. +ARG CORE_IMAGE +FROM ${CORE_IMAGE} + +WORKDIR /srv +COPY requirements-extra.txt . +RUN pip install --no-cache-dir -r requirements-extra.txt \ + && apt-get update && apt-get install -y --no-install-recommends fonts-liberation && rm -rf /var/lib/apt/lists/* + +COPY app ./app +COPY seed ./seed +COPY scripts ./scripts + +# Core liegt im Image unter /app (core/, requirements.txt, BUILD_INFO.json) +ENV PLATFORM_DIR=/app PORT=8300 PYTHONUNBUFFERED=1 ONYSCRIBE_SKIP_DOTENV=1 +EXPOSE 8300 +HEALTHCHECK --interval=30s --timeout=5s --start-period=20s CMD python -c "import urllib.request,os;urllib.request.urlopen('http://127.0.0.1:'+os.environ.get('PORT','8300')+'/healthz')" +CMD ["sh", "-c", "cd /srv && uvicorn app.main:app --host 0.0.0.0 --port ${PORT:-8300} --proxy-headers --forwarded-allow-ips='*'"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..5a50374 --- /dev/null +++ b/README.md @@ -0,0 +1,141 @@ +# Onyscribe Admin + +Separat gehostete Admin-Plattform für die Tenants von **Onyscribe** (Repo `transkript-platform`): Tenants anlegen und bearbeiten, +Live-Vorschau mit dem echten Core, versionieren, Secrets/OIDC/Domain pflegen, deployen, mit KI-Agent (Cortecs). + +## Stand + +Alles, was **ohne Änderung am Core und ohne echte Deployments** möglich ist, ist umgesetzt: + +| Bereich | Stand | +|---|---| +| Tenants (7 importiert, Hash-identisch zu Git) | ✔ Import, Seed, Anlegen/Klonen, Status, Ressourcen, Notizen, Archivieren/Löschen | +| Entwurf → Diff → Version | ✔ unveränderliche Snapshots, Rollback als Entwurf, Hook-Code-Freigabe | +| Editor | ✔ Marke/Farben, Absender, PDF-Layout, Prompt, Dateien, Flags/STT, Hook-Code, tenant.json | +| Live-Vorschau | ✔ Web-UI + PDF mit dem echten Core in Sandbox (kein Secret, CPU-/Datei-Limits), Validierung | +| Prompt-Test | ✔ echter LLM-Lauf (braucht Cortecs-Key), finaler Prompt inkl. Hooks | +| KI-Agent | ✔ echter Tool-Loop (Messages- oder Chat-API gegen Cortecs), Workspace-Entwurf, Diff, Freigabe; ✔ Demo-Modus ohne Key; ⚠ gegen Live-Cortecs noch **ungetestet** (kein Key) | +| Login (OIDC) | ✔ Code + Tests (Mock-IdP); ⚠ gegen login.onyva.dev noch **ungetestet** | +| Secrets | ✔ Fernet-verschlüsselt, Import aus SOPS (`--with-secrets`) | +| OIDC-Clients | ✔ **automatischer Abgleich bei jedem Deploy** über die Login-Developer-API: Client anlegen, Redirect-URIs, auth/totp, Freigaben; Secret wird sofort verschlüsselt gespeichert; Dry-Run liest nur. Gegen Fake-Login getestet, gegen login.onyva.dev **ungetestet** (kein Key) | +| Domain | ✔ Subdomain/eigene Domain, DNS-Check | +| Deploy-Engine | ✔ Port von `infra/deploy.py` (PATCH, Guard, Ingress, Offboard, Abbruch bei Fehler), per Fake-HTTP getestet; **Schreibzugriffe gesperrt** (`DEPLOY_LIVE`) | +| Bundle-Endpoint | ✔ `GET /api/tenants//bundle` (Token); Gegenstück im Core: Branch `admin-platform-integration` (`core/bundle.py`) | +| **Core-Vertrag** | ✔ Schema/Manifest/Build-Info aus dem Core gelesen (`app/services/contract.py`); Formulare („Funktion & STT“ + automatisch alle neuen Optionen), Einstellungen und Container-Env werden daraus **erzeugt**; Pflicht-Secrets laut Schema | +| **Core-Releases** (Menü „Core“) | ✔ Release-Eingang für die Core-CI, Kompatibilitätsprüfung **aller** Tenants mit dem Core des Admins (Validierung + Fingerabdrücke von PDF/Web/Prompt gegen Baseline), Freigabe, Dry-Run, Canary-Rollout mit Abbruch, Health-Verifikation (Core-SHA, Bundle-Version), Pins pro Tenant, Rollback (Release/Tenant) | +| Zustandsabgleich | ✔ „Zustand prüfen“ im Dashboard und „Läuft?“ pro Tenant: fragt `/health` ab und zeigt Abweichungen | + +**Bewusst offen (braucht Core- bzw. Produktionsentscheidung):** +1. Core-Branch `admin-platform-integration` (Vertrag, Bundle-Loader, `/health`) reviewen und mergen/deployen. Erst danach `core_supports_bundle` aktivieren (Einstellungen) – bis dahin sind Deploys von Tenants mit Quelle „Admin“ gesperrt. +2. `DEPLOY_LIVE=true` + `MITTWALD_API_TOKEN` + Projekt-/Stack-ID, sobald echte Deployments gewollt sind. +3. Cortecs-Key hinterlegen → Agent-Modell auswählen (Einstellungen → „Modelle von Cortecs laden“) und gegen Live testen. +4. OIDC-Client für die Admin-Plattform in login.onyva.dev anlegen, `AUTH_ENABLED=true`. +4b. Admin-Key im Login-Dashboard erzeugen → `ONYVA_LOGIN_API_KEY` setzen; mit „Verbindung testen“ (Einstellungen) prüfen; zum Schreiben `OIDC_SYNC_LIVE=true`. +5. Datenbank-Migrationen (Alembic) vor dem ersten produktiven Schemawechsel; Tabellen entstehen derzeit per `create_all`. + +## Starten + +```bash +# lokal (SQLite, kein Docker) +python3 -m venv .venv && . .venv/bin/activate && pip install -r requirements.txt +# System-Libs für WeasyPrint: libpango-1.0-0 libpangoft2-1.0-0 fonts-noto-core +cp .env.example .env # Keys eintragen (wird beim Start eingelesen; echte Env-Variablen haben Vorrang) +uvicorn app.main:app --port 8300 # http://localhost:8300 (Seed lädt die 7 Tenants automatisch) – nach .env-Änderungen neu starten + +# mit Postgres (wie Coolify) +export POSTGRES_PASSWORD=... SECRET_KEY=$(python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())") +docker compose up -d --build +``` + +**Coolify:** Neue Ressource → Docker Compose → dieses Repo. Env `POSTGRES_PASSWORD` und `SECRET_KEY` setzen (weitere Variablen: `.env.example`), +Domain auf Service `admin`, Port `8300`. Backup: Volume `pgdata` **und** `SECRET_KEY`. + +**Login aktivieren:** Client in login.onyva.dev anlegen (Redirect `https:///auth/callback`), dann `AUTH_ENABLED=true`, `OIDC_CLIENT_ID/SECRET`, +`OIDC_REDIRECT_URI`, `OIDC_LOGOUT_REDIRECT_URI` und eine Zugriffsregel (`ADMIN_ALLOWED_EMAILS` und/oder `ADMIN_REQUIRED_ROLE`). Ohne Regel wird jeder Login abgelehnt. + +## Zusammenspiel mit dem Core + +Spezifikation: `transkript-platform/docs/CONTRACT.md`. Kurz: Der Core liefert **Image + Schema + Manifest + Bundle-Format + `/health`**, der Admin liest das – +er hält keine eigene Kopie der Tenant-Optionen. + +``` +Core-Push → CI: Tests → Image (:sha) → POST /api/core/releases (Job „notify-admin“) + → Admin neu bauen (Dockerfile.fromcore, FROM Core-Image) → „Core“: Prüfen (alle Tenants) → Freigeben → Ausrollen (Canary zuerst) → Health-Check je Tenant +Tenant-Änderung (ohne Core): Veröffentlichen → Deploy mit dem aktiven Core-Tag (nur Bundle-Neustart, kein Image-Build) +``` + +- **Admin auf Basis des Core-Images:** `Dockerfile.fromcore` (`CORE_IMAGE=/transkript-platform:`). Sandbox, Schriften und Pakete sind identisch zur Produktion. Läuft der Admin auf einem anderen Core als ein gemeldetes Release, zeigt „Core“ das an und erlaubt keine Prüfung/Freigabe. *Noch zu verifizieren in Coolify:* wie der Neubau mit neuem Tag ausgelöst wird (Webhook + `CORE_IMAGE` per Env/API oder `latest` mit „immer pullen“). +- **Lokal ohne Core-Image:** vendored Snapshot (`scripts/sync_core.sh`, zieht den aktuellen Stand der Quelle inkl. Branch). +- **Neue Core-Option?** Steht sie im Schema des Cores (CI erzwingt das), erscheint sie hier automatisch in Formularen, Einstellungen und Container-Env. +- **Release-Eingang:** Env `CORE_RELEASE_TOKEN` (Admin) = Secret `ADMIN_RELEASE_TOKEN` (Core-CI) + Variable `ADMIN_URL`. + +## OIDC-Abgleich (Login-Developer-API) + +Pro Tenant (Domain & Login) gibt es einen Soll-Zustand und eine **Verwaltung**: + +| Modus | Verhalten beim Deploy | +|---|---| +| `off` | nichts anfassen | +| `adopt` (Standard für die 7 importierten Altclients) | prüfen, dass die Redirect-URIs (Subdomain + ggf. eigene Domain) enthalten sind, fehlende ergänzen – sonst nichts ändern | +| `managed` (Standard für neue Tenants) | Client fehlt → **anlegen**; sonst Redirect-URIs, `auth_mode`, `totp_mode`, `allow_registration`, Backchannel exakt wie konfiguriert; Freigaben setzen (optional „exakt“: überzählige entziehen) | + +Ablauf eines Deploys: **1.** OIDC abgleichen (bei Neuanlage Client-ID/-Secret sofort verschlüsselt speichern) → **2.** Pflicht-Secrets prüfen → **3.** Service-PATCH mit den Werten +im Env → **4.** Ingress/Health. Schlägt der Abgleich fehl, wird **vor** dem Service-Eingriff abgebrochen. Dry-Run liest nur und zeigt „würde anlegen/anpassen“. +Zusätzlich manuell: „Gegen Login prüfen“, „Jetzt abgleichen“, „Aus Login übernehmen“ (Freigaben), „Secret rotieren“, „OIDC-Client im Login löschen“ (Gefahrenbereich). +Das Secret ist nur bei Anlage/Rotation sichtbar; ein Altclient ohne Secret in der Admin-DB wird **nie** automatisch rotiert (er würde laufende Logins unterbrechen) – Secret eintragen oder bewusst rotieren. +Lokal ausprobieren ohne echtes Login: `python scripts/fake_login_server.py` (siehe Datei-Kopf). + +## KI-Agent + +**Bedienung:** Header → „KI-Agent“. Der Chat ersetzt in der Mitte das Formular, die **Live-Vorschau bleibt rechts** und zeigt den Arbeitsstand des Agenten *während er arbeitet* +(„Agent-Stand (live)“, rendert nach jeder Änderung neu), danach den „Agent-Vorschlag“. „In Entwurf übernehmen“ schreibt ihn in den Entwurf, „Verwerfen“ lässt alles unverändert. +**Key-Suche:** geteiltes Secret (Einstellungen) → Env/`.env` `CORTECS_API_KEY` → Key des Tenants. Der Chat zeigt, woher der Key kommt, bzw. „Demo-Modus – kein Key gefunden“. + +Cortecs bietet neben Chat-Completions auch das **Anthropic-Messages-Protokoll** (`/v1/messages`) – der Agent nutzt standardmäßig dieses +(Einstellung `agent_api`), mit Fallback auf Chat-Completions. Modell: Einstellung `agent_model` (Standard `claude-4-6-sonnet`, wie das Protokoll-Modell; +„Modelle von Cortecs laden“ zeigt die verfügbaren IDs und markiert Tool-Unterstützung). Der Agent arbeitet nur auf einem Entwurfs-Workspace; Namenslisten +sind gesperrt; Secrets kennt er nicht; Veröffentlichen/Deployen kann er nicht. + +## Aufbau + +``` +app/ + main.py FastAPI, Startup (DB anlegen, Seed laden) + models.py Tenant, Version (unveränderlich), Blob (content-addressed), Secret (verschlüsselt), Deployment, AuditLog, ChatMessage + services/ + store.py Entwurf ↔ Version, Diff, Bundle (tar.gz) – Kern der Versionierung + preview.py Live-Vorschau: Subprozess mit Kopie des Cores + Tenant, ohne Secrets (preview_worker.py) + importer.py Import aus ../transkript-platform (tenants/*, Secrets nur als Schlüsselnamen) + deploy_sim.py Deploy-Plan (wie infra/deploy.py) + Simulation ← hier später die echte Mittwald-Logik + agent_mock.py Mock-Agent ← hier später der Cortecs-Loop + seed.py Start-Daten (seed/tenants.seed.json.gz) + routers/ api.py (JSON), pages.py (HTML) +vendor/platform/ Snapshot des Cores (CORE_VERSION) – Vorschau führt genau diesen Stand aus +scripts/ import_tenants.py, verify_import.py, export_seed.py, sync_core.sh +tests/test_flow.py E2E: Import, Vorschau, Entwurf→Veröffentlichen, Validierung, Bundle, Deploy-Sim, Agent +``` + +## Wichtige Abläufe + +```bash +python scripts/import_tenants.py # Tenants (+ Secret-SCHLÜSSEL) aus ../transkript-platform importieren +python scripts/import_tenants.py --with-secrets # zusätzlich Secret-WERTE via `sops -d` lesen und verschlüsselt speichern (Cut-over) +python scripts/verify_import.py # Beweis: DB-Bundle == Git-Ordner (Hash-Vergleich) +python scripts/export_seed.py # DB-Stand als Seed-Datei ins Repo (ohne Secret-Werte) +scripts/sync_core.sh # vendored Core aus transkript-platform aktualisieren +python -m pytest tests # Tests (51) (isoliert: lesen weder .env noch echte Keys, eigene Temp-DB) +``` + +## Bundle-Endpoint (Schnittstelle zum Core) + +`GET /api/tenants//bundle` mit `Authorization: Bearer ` liefert `tenant.json` + alle Dateien +(+ `MANIFEST.json` mit Hashes) – ohne Secrets. Das ist, was ein Tenant-Container später beim Start abholt +(`TENANT_SOURCE=admin`, Phase 1 im Core – noch nicht umgesetzt). + +## Nächste Schritte + +1. Core: `TENANT_SOURCE=git|admin` + Bundle-Loader mit Cache (Phase 1) +2. OIDC-Login der Admin-Plattform über login.onyva.dev +3. Spike: Cortecs-Modell für den Agent (Tool-Calling, Streaming, Bild-Input) → `agent_mock.py` ersetzen +4. Echte Deploys (Mittwald) aus `deploy_sim.py`, Rollout-Abbruch bei Fehler, Health-Check +5. Hook-Code-Freigabe härten (Sandbox ohne Netz), Rollen diff --git a/app/__init__.py b/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/agent/__init__.py b/app/agent/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/agent/backends.py b/app/agent/backends.py new file mode 100644 index 0000000..8e5726f --- /dev/null +++ b/app/agent/backends.py @@ -0,0 +1,129 @@ +"""LLM-Backends für den Agenten. Interne Nachrichten im Anthropic-Block-Format: + assistant: [{"type":"text"|"tool_use",...}] · user: str | [{"type":"tool_result","tool_use_id","content"}] +""" +from __future__ import annotations + +import json +import re +import uuid +from dataclasses import dataclass, field + + +@dataclass +class Turn: + blocks: list[dict] + usage: dict = field(default_factory=dict) + + +class MessagesBackend: + """Anthropic-Messages-Protokoll – Cortecs bietet es unter https://api.cortecs.ai/v1/messages an.""" + name = "messages" + + def __init__(self, api_key: str, base_url: str, model: str): + import anthropic + root = re.sub(r"/v1/?$", "", base_url.rstrip("/")) # SDK hängt /v1/messages selbst an + self.client = anthropic.Anthropic(api_key=api_key, auth_token=api_key, base_url=root, max_retries=2, timeout=180) + self.model = model + + def step(self, system: str, messages: list[dict], tools: list[dict]) -> Turn: + r = self.client.messages.create( + model=self.model, max_tokens=8000, system=system, messages=messages, + tools=[{"name": t["name"], "description": t["description"], "input_schema": t["schema"]} for t in tools]) + blocks = [] + for b in r.content: + if b.type == "text": + blocks.append({"type": "text", "text": b.text}) + elif b.type == "tool_use": + blocks.append({"type": "tool_use", "id": b.id, "name": b.name, "input": b.input}) + return Turn(blocks, {"in": r.usage.input_tokens, "out": r.usage.output_tokens}) + + +class ChatBackend: + """OpenAI-Chat-Completions (Fallback, falls ein Modell nur diesen Weg mit Tools kann).""" + name = "chat" + + def __init__(self, api_key: str, base_url: str, model: str): + from openai import OpenAI + self.client = OpenAI(api_key=api_key, base_url=base_url, max_retries=2, timeout=180) + self.model = model + + @staticmethod + def _convert(system: str, messages: list[dict]) -> list[dict]: + out = [{"role": "system", "content": system}] + for m in messages: + c = m["content"] + if isinstance(c, str): + out.append({"role": m["role"], "content": c}) + elif m["role"] == "assistant": + text = "".join(b["text"] for b in c if b["type"] == "text") + calls = [{"id": b["id"], "type": "function", "function": {"name": b["name"], "arguments": json.dumps(b["input"])}} + for b in c if b["type"] == "tool_use"] + msg = {"role": "assistant", "content": text or None} + if calls: + msg["tool_calls"] = calls + out.append(msg) + else: + for b in c: + out.append({"role": "tool", "tool_call_id": b["tool_use_id"], "content": b["content"]}) + return out + + def step(self, system, messages, tools) -> Turn: + r = self.client.chat.completions.create( + model=self.model, max_tokens=8000, temperature=0.2, messages=self._convert(system, messages), + tools=[{"type": "function", "function": {"name": t["name"], "description": t["description"], "parameters": t["schema"]}} for t in tools]) + msg = r.choices[0].message + blocks = [] + if msg.content: + blocks.append({"type": "text", "text": msg.content}) + for tc in msg.tool_calls or []: + try: + args = json.loads(tc.function.arguments or "{}") + except json.JSONDecodeError: + args = {} + blocks.append({"type": "tool_use", "id": tc.id, "name": tc.function.name, "input": args}) + u = r.usage + return Turn(blocks, {"in": getattr(u, "prompt_tokens", 0), "out": getattr(u, "completion_tokens", 0)}) + + +HEX = re.compile(r"#[0-9a-fA-F]{6}\b") + + +def _shade(h, f): + h = h.lstrip("#"); c = [max(0, min(255, int(int(h[i:i + 2], 16) * f))) for i in (0, 2, 4)] + return "#%02X%02X%02X" % tuple(c) + + +def _tint(h, a): + h = h.lstrip("#"); c = [int(int(h[i:i + 2], 16) + (255 - int(h[i:i + 2], 16)) * a) for i in (0, 2, 4)] + return "#%02X%02X%02X" % tuple(c) + + +class MockBackend: + """Demo ohne Cortecs-Key: spielt über dieselben Tools zwei einfache Aufgaben durch.""" + name = "mock" + model = "mock" + + def step(self, system, messages, tools) -> Turn: + used = sum(1 for m in messages if m["role"] == "assistant") + user = next(m["content"] for m in messages if m["role"] == "user" and isinstance(m["content"], str)) + low = user.lower() + tid = lambda: "mock_" + uuid.uuid4().hex[:8] # noqa: E731 + call = lambda name, **a: {"type": "tool_use", "id": tid(), "name": name, "input": a} # noqa: E731 + hexes = HEX.findall(user) + if hexes and any(w in low for w in ("farbe", "akzent", "color", "design")): + a = hexes[0].upper() + plan = [[call("set_config", key=f"colors.{k}", value=v) for k, v in + {"accent": a, "accent_dark": _shade(a, .72), "accent_mid": _shade(a, 1.12), + "accent_light": _tint(a, .88), "accent_xlight": _tint(a, .94)}.items()], + [call("validate")]] + final = f"Akzentfarbe auf {a} gesetzt und die abgeleiteten Töne angepasst." + elif "prompt" in low or "regel" in low: + rule = re.sub(r"^(bitte\s+)?(füge\s+)?(dem\s+)?prompt\s*(hinzu)?[:,]?\s*", "", user.strip(), flags=re.I) + plan = [[call("read_core_default", name="prompt.txt")], [call("__append_prompt__", rule=rule)], [call("validate")]] + final = "Zusatzregel im Prompt ergänzt." + else: + return Turn([{"type": "text", "text": "Demo-Modus – es wurde kein Cortecs-Key gefunden (geprüft: Einstellungen → Geteilte Secrets, Env/.env CORTECS_API_KEY, Key des Tenants). " + "Key setzen und die Seite neu laden. Ohne Key verstehe ich nur „Setze die Akzentfarbe auf #RRGGBB“ und „Füge dem Prompt hinzu: …“."}]) + if used < len(plan): + return Turn(plan[used]) + return Turn([{"type": "text", "text": final}]) diff --git a/app/agent/loop.py b/app/agent/loop.py new file mode 100644 index 0000000..9bc1293 --- /dev/null +++ b/app/agent/loop.py @@ -0,0 +1,175 @@ +"""Agent-Loop: Modell ↔ Werkzeuge auf dem Entwurfs-Workspace → Vorschlag zur Freigabe.""" +from __future__ import annotations + +import json +import uuid +from collections import OrderedDict +from copy import deepcopy +from typing import Iterator + +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.agent import backends +from app.agent.tools import TOOLS, ToolRunner +from app.agent.workspace import Workspace +from app.models import ChatMessage, Setting, Tenant +from app.services import llm, store + +MAX_TURNS = 14 + +# Arbeitsstände laufender/letzter Agent-Läufe (für die Live-Vorschau: source = "ws:"). Nur im Speicher, höchstens 24. +WORKSPACES: "OrderedDict[str, tuple[dict, dict]]" = OrderedDict() + + +def remember(run_id: str, ws: Workspace) -> None: + WORKSPACES[run_id] = (deepcopy(ws.cfg), dict(ws.files)) + WORKSPACES.move_to_end(run_id) + while len(WORKSPACES) > 24: + WORKSPACES.popitem(last=False) +DEFAULT_MODEL = "claude-4-6-sonnet" + +SYSTEM = """Du bist der Konfigurations-Agent der Onyscribe-Admin-Plattform. Onyscribe erzeugt aus Gesprächsaufzeichnungen Protokolle +(Transkription → LLM-Protokoll → PDF/Word). Jeder Kunde ist ein „Tenant“; alles, was ihn vom Standard unterscheidet, sind DATEN: +tenant.json (Name, Farben, Kontaktdaten, Flags, STT), prompt.txt, protocol.html/protocol.css (PDF-Layout), optional overrides.py +(Hook-Code) und Zusatzdateien. Der Core-Code der Plattform ist NICHT veränderbar und nicht sichtbar – du arbeitest ausschließlich an Tenant-Daten. + +Arbeitsweise: +- Du arbeitest auf einem ENTWURF im Speicher. Nichts ist live; am Ende prüft ein Mensch deinen Vorschlag und gibt ihn frei. +- Lies zuerst, was du ändern willst (read_file / read_core_default). Ist eine Datei nicht im Tenant, gilt der Core-Standard – lege bei Bedarf eine eigene Kopie an (write_file) und ändere diese. +- Ändere minimal und gezielt (edit_file statt write_file, wenn möglich). Behalte bestehende Prompt-Struktur, Platzhalter (@@ORG@@, @@ORG_SHORT@@, @@ORG_PROFILE@@) und Metadatenblöcke (===TERMINART=== …) bei, sofern nicht ausdrücklich anders gewünscht. +- Rufe nach Änderungen validate auf (echtes Core-Rendering). Bei PDF-Änderungen zusätzlich render_pdf. Beheb Fehler, bevor du antwortest. +- Hook-Code (overrides.py) nur, wenn es mit Daten/Flags nicht geht; schreibe ihn knapp und nutze nur die Hooks build_prompt, transform_transcript, pdf_context, extra_routes. +- Dateien mit personenbezogenen Daten (Namenslisten) sind gesperrt. Secrets, Keys und Zugangsdaten kennst du nicht und fasst du nie an. +- Schreibe Prompt-Inhalte auf Deutsch, im Ton der vorhandenen Datei. Erfinde keine Fakten über den Kunden. +- Antworte am Ende kurz auf Deutsch (du-Form): was du geändert hast und worauf der Mensch beim Prüfen achten soll. Keine Markdown-Überschriften.""" + + +def _setting(db: Session, key: str, default: str = "") -> str: + s = db.get(Setting, key) + return s.value if s and s.value else default + + +def make_backend(db: Session, tenant_id: str | None = None): + model = _setting(db, "agent_model", DEFAULT_MODEL) + key = llm.api_key(db, tenant_id) + if not key: + return backends.MockBackend() + api = _setting(db, "agent_api", "messages") + cls = backends.MessagesBackend if api == "messages" else backends.ChatBackend + return cls(key, llm.base_url(db), model) + + +def _context(tenant: Tenant, ws: Workspace) -> str: + return (f"Tenant: {tenant.id} („{ws.cfg.get('name', '')}“). Dateien: " + + ", ".join(f['path'] for f in ws.list_files()) + ". Der Entwurf kann bereits unveröffentlichte Änderungen enthalten.") + + +def _history(db: Session, tenant_id: str, limit: int = 8) -> list[dict]: + rows = db.scalars(select(ChatMessage).where(ChatMessage.tenant_id == tenant_id).order_by(ChatMessage.id.desc()).limit(limit)).all() + out = [] + for m in reversed(rows): + if m.content: + out.append({"role": m.role, "content": m.content}) + # Anthropic verlangt Rollenwechsel beginnend mit user + while out and out[0]["role"] != "user": + out.pop(0) + merged = [] + for m in out: + if merged and merged[-1]["role"] == m["role"]: + merged[-1]["content"] += "\n" + m["content"] + else: + merged.append(dict(m)) + return merged + + +def run(db: Session, tenant: Tenant, user_message: str, backend=None) -> Iterator[dict]: + """Generator von Ereignissen: step | text | proposal | usage | error. Schreibt NICHT in den Entwurf.""" + backend = backend or make_backend(db, tenant.id) + ws = Workspace(db, tenant) + run_id = uuid.uuid4().hex[:12] + remember(run_id, ws) + last_sig = json.dumps([ws.cfg, ws.files], sort_keys=True) + runner = ToolRunner(ws) + system = SYSTEM + "\n\n" + _context(tenant, ws) + messages = _history(db, tenant.id) + messages.append({"role": "user", "content": user_message}) + usage = {"in": 0, "out": 0} + final_text = "" + yield {"type": "mode", "backend": backend.name, "model": getattr(backend, "model", ""), "run": run_id} + try: + for _ in range(MAX_TURNS): + turn = backend.step(system, messages, TOOLS) + usage["in"] += turn.usage.get("in", 0) + usage["out"] += turn.usage.get("out", 0) + messages.append({"role": "assistant", "content": turn.blocks}) + calls = [b for b in turn.blocks if b["type"] == "tool_use"] + texts = [b["text"] for b in turn.blocks if b["type"] == "text" and b["text"].strip()] + if texts: + final_text = "\n".join(texts) + if calls: + yield {"type": "thought", "text": final_text} + if not calls: + break + results = [] + for c in calls: + name, args = c["name"], c["input"] + if name == "__append_prompt__": # nur Mock: Standard-Prompt kopieren + Regel anhängen + base = ws.read("prompt.txt") if "prompt.txt" in ws.files else ( + __import__("app.settings", fromlist=["PLATFORM_DIR"]).PLATFORM_DIR / "core" / "defaults" / "prompt.txt").read_text(encoding="utf-8") + ws.write("prompt.txt", base.rstrip() + f"\n\nZusätzliche Regel:\n{args['rule'].strip()}\n") + arg, res = "prompt.txt", "Zusatzregel angehängt" + name = "edit_file" + else: + arg, res = runner.run(name, args) + short = res if len(res) < 220 else res[:220] + " …" + if name == "validate" and not res.startswith("FEHLER"): + try: + v = json.loads(res) + short = "✔ bestanden" + (f" ({len(v['warnings'])} Hinweis(e))" if v.get("warnings") else "") if v.get("ok") else "✘ " + "; ".join(v.get("errors", []))[:200] + except (ValueError, KeyError): + pass + yield {"type": "step", "tool": name, "arg": arg, "result": short, "error": res.startswith("FEHLER")} + sig = json.dumps([ws.cfg, ws.files], sort_keys=True) + if sig != last_sig: # Arbeitsstand hat sich geändert → Live-Vorschau neu rendern lassen + last_sig = sig + remember(run_id, ws) + yield {"type": "changed", "run": run_id} + results.append({"type": "tool_result", "tool_use_id": c["id"], "content": res}) + messages.append({"role": "user", "content": results}) + else: + final_text = (final_text + "\n\n(Abgebrochen: maximale Schrittzahl erreicht.)").strip() + except llm.LLMNotConfigured as exc: + yield {"type": "error", "text": str(exc)} + return + except Exception as exc: # noqa: BLE001 – Provider-/Netzfehler sauber an die UI melden + yield {"type": "error", "text": f"{type(exc).__name__}: {str(exc)[:400]}"} + return + prop = ws.proposal(final_text.split("\n")[0][:140] or "Änderungsvorschlag") + if prop is None and any(True for m in messages if m["role"] == "assistant" and isinstance(m["content"], list) + and any(b.get("name") in ("write_file", "edit_file", "set_config", "delete_file") for b in m["content"] if b["type"] == "tool_use")): + final_text = (final_text + "\n\n(Keine Änderung gegenüber dem aktuellen Entwurf.)").strip() + yield {"type": "text", "text": final_text or "(keine Antwort)"} + yield {"type": "proposal", "proposal": prop} + yield {"type": "usage", "usage": usage} + + +def apply_proposal(db: Session, tenant: Tenant, proposal: dict) -> None: + """Freigabe: Vorschlag in den Entwurf übernehmen (nur die betroffenen Pfade).""" + if proposal.get("config") is not None: + store.set_config(db, tenant, proposal["config"]) + for path, sha in (proposal.get("files") or {}).items(): + store.set_file(db, tenant, path, store.get_blob(db, sha)) + for path in proposal.get("deleted") or []: + store.delete_file(db, tenant, path) + + +def proposal_content(db: Session, tenant: Tenant, proposal: dict) -> tuple[dict, dict]: + """Inhalt, der nach Freigabe im Entwurf stünde (für die Diff-Anzeige).""" + cfg, files = store.content(db, tenant, "draft") + if proposal.get("config") is not None: + cfg = proposal["config"] + files = {**files, **(proposal.get("files") or {})} + for p in proposal.get("deleted") or []: + files.pop(p, None) + return cfg, files diff --git a/app/agent/testrun.py b/app/agent/testrun.py new file mode 100644 index 0000000..5b935d6 --- /dev/null +++ b/app/agent/testrun.py @@ -0,0 +1,24 @@ +"""Prompt-Test: finalen Prompt vom Core bauen lassen (inkl. Hooks), LLM aufrufen.""" +from __future__ import annotations + +from app.services import llm, preview +from app.services.samples import SAMPLE_TRANSCRIPT, ROTARY_TRANSCRIPT + + +def user_content(transcript: str, terminart="", projekt="", kunde="", title="Beispiel") -> str: + return (f"Termin-Art: {terminart or '(aus Gespräch erkennen)'}\nProjektname: {projekt or '(keiner)'}\n" + f"Kunde / Unternehmen: {kunde or '(aus Gespräch erkennen)'}\nAnsprechpartner Kunde: (aus Gespräch erkennen)\n" + f"Meeting-Titel: {title}\n\nGesprächsprotokoll:\n{transcript}") + + +def default_transcript(tenant_id: str) -> str: + return ROTARY_TRANSCRIPT if tenant_id.startswith("rotary") else SAMPLE_TRANSCRIPT + + +def prompt_test(db, tenant, cfg, files, transcript: str | None, terminart="", projekt="", kunde="") -> dict: + transcript = (transcript or "").strip() or default_transcript(tenant.id) + r = preview.run_content(db, tenant, cfg, files, "prompt", + args={"title": "Prompt-Test", "terminart": terminart, "projekt": projekt, "kunde": kunde}) + out = llm.summarize(db, r["prompt"], user_content(transcript, terminart, projekt, kunde, "Prompt-Test"), tenant_id=tenant.id) + out["prompt_chars"] = r["chars"] + return out diff --git a/app/agent/tools.py b/app/agent/tools.py new file mode 100644 index 0000000..509220f --- /dev/null +++ b/app/agent/tools.py @@ -0,0 +1,110 @@ +"""Werkzeuge des Agenten (neutrale Definition + Ausführung auf dem Workspace).""" +from __future__ import annotations + +import io +import json + +from app.agent.workspace import Workspace, is_personal +from app.services import llm, preview +from app.settings import PLATFORM_DIR + +TOOLS = [ + {"name": "list_files", "description": "Listet alle Dateien des Tenants (inkl. tenant.json) mit Größe und Änderungsstatus.", + "schema": {"type": "object", "properties": {}}}, + {"name": "read_file", "description": "Liest eine Textdatei des Tenants (prompt.txt, protocol.html, protocol.css, overrides.py, tenant.json …). " + "Fehlt eine Datei, gilt der Core-Standard – nutze dann read_core_default.", + "schema": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}}, + {"name": "read_core_default", "description": "Liest eine Standarddatei des Cores als Vorlage: prompt.txt, protocol.html, protocol.css oder hooks.py (Hook-Dokumentation).", + "schema": {"type": "object", "properties": {"name": {"type": "string", "enum": ["prompt.txt", "protocol.html", "protocol.css", "hooks.py"]}}, "required": ["name"]}}, + {"name": "write_file", "description": "Schreibt/ersetzt eine Textdatei des Tenants vollständig (z. B. um eine eigene prompt.txt oder protocol.css anzulegen). Nur im Entwurf – ein Mensch gibt frei.", + "schema": {"type": "object", "properties": {"path": {"type": "string"}, "content": {"type": "string"}}, "required": ["path", "content"]}}, + {"name": "edit_file", "description": "Ersetzt in einer Datei genau eine Stelle: old_str muss exakt 1× vorkommen. Bevorzuge das gegenüber write_file bei kleinen Änderungen.", + "schema": {"type": "object", "properties": {"path": {"type": "string"}, "old_str": {"type": "string"}, "new_str": {"type": "string"}}, "required": ["path", "old_str", "new_str"]}}, + {"name": "delete_file", "description": "Löscht eine Tenant-Datei (z. B. um auf den Core-Standard zurückzufallen).", + "schema": {"type": "object", "properties": {"path": {"type": "string"}}, "required": ["path"]}}, + {"name": "set_config", "description": "Setzt einen Wert in tenant.json per Punkt-Pfad, z. B. key='colors.accent', value='#0B6E4F' oder key='flags.ui_kontakt_field', value=false.", + "schema": {"type": "object", "properties": {"key": {"type": "string"}, "value": {}}, "required": ["key", "value"]}}, + {"name": "validate", "description": "Prüft den aktuellen Workspace mit dem ECHTEN Core (Web-UI + PDF rendern, Prompt laden). Gibt Fehler/Warnungen zurück. Nach Änderungen immer aufrufen.", + "schema": {"type": "object", "properties": {}}}, + {"name": "render_pdf", "description": "Rendert das Beispielprotokoll als PDF und gibt Seitenzahl und extrahierten Text zurück, damit du Aufbau und Inhalt prüfen kannst.", + "schema": {"type": "object", "properties": {}}}, + {"name": "show_final_prompt", "description": "Zeigt den finalen System-Prompt, wie der Core ihn an das LLM schickt (nach Platzhalter-Ersetzung und Hooks). Namenslisten werden gekürzt.", + "schema": {"type": "object", "properties": {}}}, + {"name": "run_prompt_test", "description": "Führt das Protokoll-LLM mit dem Workspace-Prompt auf einem Beispieltranskript aus (kostet Geld – höchstens 1× pro Antwort). Liefert den Protokolltext.", + "schema": {"type": "object", "properties": {"transcript": {"type": "string", "description": "Optional; sonst das Standard-Beispieltranskript."}}}}, +] + + +class ToolRunner: + def __init__(self, ws: Workspace): + self.ws, self.db, self.tenant = ws, ws.db, ws.tenant + self.llm_calls = 0 + + def _preview(self, kind, **kw): + return preview.run_content(self.db, self.tenant, self.ws.cfg, self.ws.files, kind, **kw) + + def run(self, name: str, a: dict) -> tuple[str, str]: + """→ (Kurzbeschreibung des Arguments für die Anzeige, Ergebnistext).""" + try: + return getattr(self, f"t_{name}")(a) + except (KeyError, ValueError, PermissionError, SyntaxError, json.JSONDecodeError) as exc: + return a.get("path") or a.get("key") or "", f"FEHLER: {exc}" + except preview.PreviewError as exc: + return "", f"FEHLER (Core-Rendering): {str(exc)[-900:]}" + + def t_list_files(self, a): + rows = [{"path": "tenant.json", "text": True}] + self.ws.list_files() + return "", json.dumps(rows, ensure_ascii=False) + + def t_read_file(self, a): + return a["path"], self.ws.read(a["path"]) + + def t_read_core_default(self, a): + n = a["name"] + p = (PLATFORM_DIR / "core" / ("hooks.py" if n == "hooks.py" else ("defaults" if n == "prompt.txt" else "templates")) / n) \ + if n != "hooks.py" else PLATFORM_DIR / "core" / "hooks.py" + return n, p.read_text(encoding="utf-8")[:60_000] + + def t_write_file(self, a): + self.ws.write(a["path"], a["content"]) + return a["path"], f"geschrieben ({len(a['content'])} Zeichen)" + + def t_edit_file(self, a): + self.ws.edit(a["path"], a["old_str"], a["new_str"]) + return a["path"], "ersetzt" + + def t_delete_file(self, a): + self.ws.delete(a["path"]) + return a["path"], "gelöscht" + + def t_set_config(self, a): + self.ws.set_config_value(a["key"], a["value"]) + return a["key"], f"gesetzt = {json.dumps(a['value'], ensure_ascii=False)}" + + def t_validate(self, a): + r = self._preview("validate") + return "Core-Rendering", json.dumps(r, ensure_ascii=False) + + def t_render_pdf(self, a): + pdf = self._preview("pdf") + from pypdf import PdfReader + rd = PdfReader(io.BytesIO(pdf)) + text = "\n".join((pg.extract_text() or "") for pg in rd.pages) + return "Beispielprotokoll", f"{len(rd.pages)} Seite(n)\n---\n{text[:3500]}" + + def t_show_final_prompt(self, a): + r = self._preview("prompt", args={"title": "Beispiel", "terminart": "", "projekt": "", "kunde": ""}) + p = r["prompt"] + # Namenslisten (personenbezogen) nicht an das Agenten-Modell geben + marker = "Namensregister" + if marker in p: + p = p[:p.index(marker)] + "[Namensregister mit personenbezogenen Daten ausgeblendet]" + return f"{r['chars']} Zeichen", p[:40_000] + + def t_run_prompt_test(self, a): + if self.llm_calls >= 1: + return "", "FEHLER: Pro Antwort ist nur ein Prompt-Test erlaubt." + self.llm_calls += 1 + from app.agent.testrun import prompt_test + res = prompt_test(self.db, self.tenant, self.ws.cfg, self.ws.files, a.get("transcript")) + return "Beispieltranskript", f"[{res['model']}, {res['input_tokens']}→{res['output_tokens']} Tokens]\n{res['text'][:6000]}" diff --git a/app/agent/workspace.py b/app/agent/workspace.py new file mode 100644 index 0000000..5b56d3c --- /dev/null +++ b/app/agent/workspace.py @@ -0,0 +1,106 @@ +"""Entwurfs-Workspace des Agenten: Kopie des Tenant-Entwurfs im Speicher. + +Der Agent ändert NUR diese Kopie. Daraus entsteht ein Vorschlag (Diff), den der Mensch freigibt. +Datenschutz: Dateien mit personenbezogenem Inhalt (Namenslisten) sind für den Agenten nicht lesbar. +""" +from __future__ import annotations + +import json +from copy import deepcopy + +from sqlalchemy.orm import Session + +from app.models import Tenant +from app.services import store + +PERSONAL_PREFIXES = ("namensliste", "mitglieder", "members", "personen") +READ_LIMIT = 60_000 +PROTECTED = {"tenant.json"} + + +def is_personal(path: str) -> bool: + name = path.rsplit("/", 1)[-1].lower() + return name.startswith(PERSONAL_PREFIXES) + + +class Workspace: + def __init__(self, db: Session, tenant: Tenant): + self.db, self.tenant = db, tenant + cfg, files = store.content(db, tenant, "draft") + self.base_cfg, self.base_files = deepcopy(cfg), dict(files) + self.cfg, self.files = deepcopy(cfg), dict(files) # files: {pfad: sha} + + # ── Lesen ── + def list_files(self) -> list[dict]: + out = [] + for p, sha in sorted(self.files.items()): + b = self.db.get(__import__("app.models", fromlist=["Blob"]).Blob, sha) + out.append({"path": p, "bytes": b.size, "text": store.is_text_path(p), "personal_data": is_personal(p), + "changed": self.base_files.get(p) != sha}) + return out + + def read(self, path: str) -> str: + if path in ("tenant.json",): + return json.dumps(self.cfg, indent=2, ensure_ascii=False) + if path not in self.files: + raise KeyError(f"Datei nicht im Tenant: {path}") + if is_personal(path): + n = len(store.get_blob(self.db, self.files[path]).decode("utf-8", "replace").splitlines()) + return f"[Datei enthält personenbezogene Daten und ist für den Agenten gesperrt – {n} Zeilen. Inhalt nicht verfügbar.]" + if not store.is_text_path(path): + return "[Binärdatei]" + text = store.get_blob(self.db, self.files[path]).decode("utf-8", "replace") + return text[:READ_LIMIT] + ("\n[… gekürzt]" if len(text) > READ_LIMIT else "") + + # ── Schreiben ── + def write(self, path: str, content: str) -> None: + path = store.clean_path(path) + if is_personal(path): + raise PermissionError("Dateien mit personenbezogenen Daten darf der Agent nicht ändern.") + if path.endswith(".py"): + compile(content, path, "exec") # Syntaxfehler früh melden + self.files[path] = store.put_blob(self.db, content.encode("utf-8"), path) + + def edit(self, path: str, old: str, new: str) -> None: + cur = self.read(path) if path != "tenant.json" else json.dumps(self.cfg, indent=2, ensure_ascii=False) + if cur.count(old) != 1: + raise ValueError(f"old_str muss genau 1× vorkommen (gefunden: {cur.count(old)}×).") + if path == "tenant.json": + self.set_config_json(cur.replace(old, new)) + else: + self.write(path, cur.replace(old, new)) + + def delete(self, path: str) -> None: + if is_personal(path): + raise PermissionError("Dateien mit personenbezogenen Daten darf der Agent nicht löschen.") + self.files.pop(path, None) + + def set_config_json(self, text: str) -> None: + cfg = json.loads(text) + cfg.pop("deploy", None) + cfg["id"] = self.tenant.id + self.cfg = cfg + + def set_config_value(self, key_path: str, value) -> None: + cur = self.cfg + keys = key_path.split(".") + for k in keys[:-1]: + cur = cur.setdefault(k, {}) + cur[keys[-1]] = value + + # ── Ergebnis ── + def changed(self) -> bool: + return self.cfg != self.base_cfg or self.files != self.base_files + + def proposal(self, summary: str) -> dict | None: + if not self.changed(): + return None + files = {p: s for p, s in self.files.items() if self.base_files.get(p) != s} + deleted = [p for p in self.base_files if p not in self.files] + items = [] + if self.cfg != self.base_cfg: + items.append({"path": "tenant.json", "kind": "geändert"}) + items += [{"path": p, "kind": "neu" if p not in self.base_files else "geändert"} for p in files] + items += [{"path": p, "kind": "gelöscht"} for p in deleted] + return {"summary": summary, "config": self.cfg if self.cfg != self.base_cfg else None, + "files": files, "deleted": deleted, "items": items} diff --git a/app/auth.py b/app/auth.py new file mode 100644 index 0000000..00f4764 --- /dev/null +++ b/app/auth.py @@ -0,0 +1,162 @@ +"""OIDC-Login der Admin-Plattform über login.onyva.dev (Authorization-Code + PKCE, wie im Core). + +Aktiv mit AUTH_ENABLED=true. Env: OIDC_ISSUER, OIDC_CLIENT_ID, OIDC_CLIENT_SECRET, OIDC_REDIRECT_URI, +OIDC_LOGOUT_REDIRECT_URI, APP_COOKIE_SECURE, sowie die Zugriffsregel (mind. eine): + ADMIN_ALLOWED_EMAILS=a@x.de,b@y.de und/oder ADMIN_REQUIRED_ROLE=admin (gegen das Claim `app_roles`) +Ohne Zugriffsregel wird jeder Login abgelehnt (Default-Deny) – die Admin-Plattform hält alle Secrets. +""" +from __future__ import annotations + +import base64 +import hashlib +import hmac +import json +import os +import re +import secrets +import time +from urllib.parse import urlencode + +import httpx +from fastapi import APIRouter, HTTPException, Request +from fastapi.responses import HTMLResponse, JSONResponse, RedirectResponse + +from app.settings import AUTH_ENABLED, SECRET_KEY + +COOKIE, STATE_COOKIE, STATE_TTL, SESSION_TTL = "oa_session", "oa_oauth", 600, 12 * 3600 +router = APIRouter() + +PUBLIC = re.compile(r"^/(healthz|auth/.*|static/.*|api/tenants/[^/]+/bundle|api/core/releases)$") # bundle: Token · releases: CI-Token (POST), GET prüft die Session selbst +DEV_USER = {"sub": "dev", "email": "dev@local", "name": "Dev (Auth aus)", "app_roles": ["admin"]} + + +def cfg() -> dict: + g = lambda k, d="": os.getenv(k, d).strip() # noqa: E731 + return { + "issuer": g("OIDC_ISSUER", "https://login.onyva.dev").rstrip("/"), "client_id": g("OIDC_CLIENT_ID"), + "client_secret": g("OIDC_CLIENT_SECRET"), "redirect": g("OIDC_REDIRECT_URI", "http://localhost:8300/auth/callback"), + "logout_redirect": g("OIDC_LOGOUT_REDIRECT_URI", "http://localhost:8300/"), + "secure": g("APP_COOKIE_SECURE", "false").lower() == "true", + "emails": {e.strip().lower() for e in g("ADMIN_ALLOWED_EMAILS").split(",") if e.strip()}, + "role": g("ADMIN_REQUIRED_ROLE"), + } + + +def _sign(data: dict) -> str: + payload = base64.urlsafe_b64encode(json.dumps(data, separators=(",", ":")).encode()).decode().rstrip("=") + return f"{payload}.{hmac.new(SECRET_KEY.encode(), payload.encode(), hashlib.sha256).hexdigest()}" + + +def _verify(token: str) -> dict | None: + try: + payload, _, sig = token.partition(".") + if not sig or not hmac.compare_digest(sig, hmac.new(SECRET_KEY.encode(), payload.encode(), hashlib.sha256).hexdigest()): + return None + data = json.loads(base64.urlsafe_b64decode(payload + "=" * (-len(payload) % 4))) + return data if int(data.get("exp", 0)) > time.time() else None + except Exception: # noqa: BLE001 + return None + + +def session_user(request: Request) -> dict | None: + if not AUTH_ENABLED: + return DEV_USER + tok = request.cookies.get(COOKIE) + return _verify(tok) if tok else None + + +def is_allowed(user: dict) -> bool: + c = cfg() + if not c["emails"] and not c["role"]: + return False + if user.get("email", "").lower() in c["emails"]: + return True + return bool(c["role"]) and c["role"] in (user.get("app_roles") or []) + + +async def middleware(request: Request, call_next): + user = session_user(request) + request.state.user = user or {} + if user is None and not PUBLIC.match(request.url.path): + if request.url.path.startswith(("/api/", "/preview/")): + return JSONResponse({"detail": "Nicht angemeldet"}, status_code=401) + return RedirectResponse("/auth/login", status_code=302) + return await call_next(request) + + +def actor_name(request: Request) -> str: + u = getattr(request.state, "user", None) or {} + return u.get("email") or u.get("name") or "unbekannt" + + +# ── Routen ────────────────────────────────────────────────────────────────── + +def exchange_code(code: str, verifier: str) -> dict: + """Token-Tausch beim IdP (in Tests ersetzbar).""" + c = cfg() + r = httpx.post(f"{c['issuer']}/oauth/token", timeout=20, data={ + "grant_type": "authorization_code", "code": code, "redirect_uri": c["redirect"], "client_id": c["client_id"], + "client_secret": c["client_secret"], "code_verifier": verifier}) + if r.status_code >= 400: + raise HTTPException(502, f"Token-Tausch fehlgeschlagen ({r.status_code})") + return r.json() + + +def _claims(id_token: str) -> dict: + try: + p = id_token.split(".")[1] + return json.loads(base64.urlsafe_b64decode(p + "=" * (-len(p) % 4))) + except Exception: # noqa: BLE001 + return {} + + +@router.get("/auth/login") +def login(): + c = cfg() + if not AUTH_ENABLED: + return RedirectResponse("/", 302) + if not c["client_id"] or not c["client_secret"]: + raise HTTPException(503, "OIDC nicht konfiguriert (OIDC_CLIENT_ID / OIDC_CLIENT_SECRET).") + state, verifier = secrets.token_urlsafe(24), secrets.token_urlsafe(64) + challenge = base64.urlsafe_b64encode(hashlib.sha256(verifier.encode()).digest()).rstrip(b"=").decode() + q = urlencode({"response_type": "code", "client_id": c["client_id"], "redirect_uri": c["redirect"], "scope": "openid profile email", + "state": state, "code_challenge": challenge, "code_challenge_method": "S256"}) + resp = RedirectResponse(f"{c['issuer']}/oauth/authorize?{q}", 302) + resp.set_cookie(STATE_COOKIE, _sign({"state": state, "cv": verifier, "exp": int(time.time()) + STATE_TTL}), + max_age=STATE_TTL, httponly=True, secure=c["secure"], samesite="lax") + return resp + + +@router.get("/auth/callback") +def callback(request: Request, code: str = "", state: str = "", error: str = ""): + c = cfg() + if error: + raise HTTPException(400, f"Login abgebrochen: {error}") + pending = _verify(request.cookies.get(STATE_COOKIE, "") or "") + if not pending or not hmac.compare_digest(str(pending.get("state", "")), state) or not code: + return RedirectResponse("/auth/login", 303) # abgelaufen/Reload → neu starten + tokens = exchange_code(code, pending["cv"]) + cl = _claims(tokens.get("id_token", "")) + user = {"sub": cl.get("sub", ""), "email": cl.get("email", ""), "name": cl.get("name", ""), "app_roles": cl.get("app_roles", [])} + if not is_allowed(user): + return HTMLResponse(f"

Kein Zugriff

{user['email'] or 'Dieses Konto'} " + "ist für die Onyscribe-Admin-Plattform nicht freigeschaltet.

Abmelden

", status_code=403) + resp = RedirectResponse("/", 303) + resp.set_cookie(COOKIE, _sign({**user, "exp": int(time.time()) + SESSION_TTL}), max_age=SESSION_TTL, httponly=True, + secure=c["secure"], samesite="lax") + resp.delete_cookie(STATE_COOKIE) + return resp + + +@router.get("/auth/logout") +def logout(): + c = cfg() + url = f"{c['issuer']}/logout?{urlencode({'post_logout_redirect_uri': c['logout_redirect']})}" if AUTH_ENABLED else "/" + resp = RedirectResponse(url, 302) + resp.delete_cookie(COOKIE) + return resp + + +@router.get("/auth/me") +def me(request: Request): + return {"user": getattr(request.state, "user", {}), "auth_enabled": AUTH_ENABLED} diff --git a/app/db.py b/app/db.py new file mode 100644 index 0000000..47e3dc4 --- /dev/null +++ b/app/db.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from contextlib import contextmanager + +from sqlalchemy import create_engine +from sqlalchemy.orm import DeclarativeBase, sessionmaker + +from app.settings import DATABASE_URL + +_kwargs = {"connect_args": {"check_same_thread": False}} if DATABASE_URL.startswith("sqlite") else {"pool_pre_ping": True} +engine = create_engine(DATABASE_URL, **_kwargs) +SessionLocal = sessionmaker(bind=engine, expire_on_commit=False, autoflush=True) + + +class Base(DeclarativeBase): + pass + + +def init_db() -> None: + from app import models # noqa: F401 + Base.metadata.create_all(engine) + + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() + + +@contextmanager +def session(): + db = SessionLocal() + try: + yield db + db.commit() + except Exception: + db.rollback() + raise + finally: + db.close() diff --git a/app/deps.py b/app/deps.py new file mode 100644 index 0000000..214a229 --- /dev/null +++ b/app/deps.py @@ -0,0 +1,19 @@ +from __future__ import annotations + +from fastapi import Depends, HTTPException, Request +from sqlalchemy.orm import Session + +from app.auth import actor_name +from app.db import get_db +from app.models import Tenant + + +def actor(request: Request) -> str: + return actor_name(request) + + +def tenant_or_404(tenant_id: str, db: Session = Depends(get_db)) -> Tenant: + t = db.get(Tenant, tenant_id) + if t is None: + raise HTTPException(404, f"Tenant „{tenant_id}“ nicht gefunden") + return t diff --git a/app/main.py b/app/main.py new file mode 100644 index 0000000..2afcecc --- /dev/null +++ b/app/main.py @@ -0,0 +1,42 @@ +from __future__ import annotations + +from contextlib import asynccontextmanager + +from fastapi import FastAPI +from fastapi.staticfiles import StaticFiles + +from app.db import init_db, session +from app import auth +from app.routers import api, pages +from sqlalchemy import func, select + +from app.models import Tenant +from app.services import seed +from app.services.importer import seed_settings +from app.settings import ROOT + +SEED_FILE = ROOT / "seed" / "tenants.seed.json.gz" + + +@asynccontextmanager +async def lifespan(_: FastAPI): + init_db() + with session() as db: + # Frische Instanz → mit den importierten Tenants starten (ohne Secret-Werte) + if SEED_FILE.exists() and not db.scalar(select(func.count()).select_from(Tenant)): + print(f"[seed] {seed.load(db, SEED_FILE)} Tenants aus {SEED_FILE.name} geladen") + seed_settings(db) + yield + + +app = FastAPI(title="Onyscribe Admin", lifespan=lifespan) +app.middleware("http")(auth.middleware) +app.include_router(auth.router) +app.mount("/static", StaticFiles(directory=str(ROOT / "app" / "static")), name="static") +app.include_router(api.router) +app.include_router(pages.router) + + +@app.get("/healthz") +def healthz(): + return {"ok": True} diff --git a/app/models.py b/app/models.py new file mode 100644 index 0000000..6d31de9 --- /dev/null +++ b/app/models.py @@ -0,0 +1,149 @@ +"""Datenmodell. Inhalte sind content-addressed (Blob) und versioniert (Version).""" +from __future__ import annotations + +from datetime import datetime, timezone + +from sqlalchemy import JSON, Boolean, DateTime, Float, ForeignKey, Integer, LargeBinary, String, Text, UniqueConstraint +from sqlalchemy.orm import Mapped, mapped_column, relationship + +from app.db import Base + + +def now() -> datetime: + return datetime.now(timezone.utc) + + +class Tenant(Base): + __tablename__ = "tenants" + + id: Mapped[str] = mapped_column(String(64), primary_key=True) # Slug, == TENANT-Env im Container + name: Mapped[str] = mapped_column(String(200)) + status: Mapped[str] = mapped_column(String(20), default="active") # active | paused | archived + source: Mapped[str] = mapped_column(String(10), default="git") # TENANT_SOURCE im Container: git | admin + subdomain: Mapped[str] = mapped_column(String(100), default="") + custom_domain: Mapped[str] = mapped_column(String(200), default="") + domain_status: Mapped[str] = mapped_column(String(20), default="none") # none | pending | verified + cpu: Mapped[float] = mapped_column(Float, default=0.5) + memory: Mapped[str] = mapped_column(String(20), default="512M") + current_version: Mapped[int | None] = mapped_column(Integer, nullable=True) + deployed_version: Mapped[int | None] = mapped_column(Integer, nullable=True) + deployed_image: Mapped[str] = mapped_column(String(100), default="") + deployed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + draft: Mapped[dict | None] = mapped_column(JSON, nullable=True) # {"config": {...}, "files": {path: sha}} + preview_sample: Mapped[str | None] = mapped_column(Text, nullable=True) + oidc: Mapped[dict | None] = mapped_column(JSON, nullable=True) # Soll-Zustand des OIDC-Clients + letzter Abgleich + core_pin: Mapped[str | None] = mapped_column(String(100), nullable=True) # fester Core-Tag (nimmt an Rollouts nicht teil) + render_baseline: Mapped[dict | None] = mapped_column(JSON, nullable=True) # {version, core, fp:{…}} Referenz für die Kompatibilitätsprüfung + notes: Mapped[str] = mapped_column(Text, default="") + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now) + + versions: Mapped[list["Version"]] = relationship(back_populates="tenant", order_by="Version.number.desc()") + + +class Blob(Base): + """Dateiinhalt, adressiert über SHA-256. Später: große Binärdateien nach S3 auslagern.""" + __tablename__ = "blobs" + + sha: Mapped[str] = mapped_column(String(64), primary_key=True) + content: Mapped[bytes] = mapped_column(LargeBinary) + size: Mapped[int] = mapped_column(Integer) + is_text: Mapped[bool] = mapped_column(Boolean, default=True) + + +class Version(Base): + """Unveränderlicher Snapshot eines Tenants.""" + __tablename__ = "versions" + __table_args__ = (UniqueConstraint("tenant_id", "number"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + tenant_id: Mapped[str] = mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), index=True) + number: Mapped[int] = mapped_column(Integer) + message: Mapped[str] = mapped_column(String(500), default="") + author: Mapped[str] = mapped_column(String(100), default="") # "ruben" | "agent:" | "import" + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now) + config: Mapped[dict] = mapped_column(JSON) # Inhalt der tenant.json (ohne deploy-Block) + files: Mapped[dict] = mapped_column(JSON) # {pfad: sha} + + tenant: Mapped[Tenant] = relationship(back_populates="versions") + + +class Secret(Base): + """Verschlüsselter Secret-Wert. tenant_id NULL = geteilt für alle Tenants.""" + __tablename__ = "secrets" + __table_args__ = (UniqueConstraint("tenant_id", "key"),) + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + tenant_id: Mapped[str | None] = mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), nullable=True, index=True) + key: Mapped[str] = mapped_column(String(100)) + value_enc: Mapped[str | None] = mapped_column(Text, nullable=True) + source: Mapped[str] = mapped_column(String(30), default="manual") # manual | sops-import + updated_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now, onupdate=now) + + +class Setting(Base): + __tablename__ = "settings" + + key: Mapped[str] = mapped_column(String(100), primary_key=True) + value: Mapped[str] = mapped_column(Text, default="") + + +class Deployment(Base): + __tablename__ = "deployments" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + batch_id: Mapped[str] = mapped_column(String(40), default="", index=True) + tenant_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + kind: Mapped[str] = mapped_column(String(20), default="deploy") # deploy | dry-run | offboard + version: Mapped[int | None] = mapped_column(Integer, nullable=True) + image_tag: Mapped[str] = mapped_column(String(100), default="") + status: Mapped[str] = mapped_column(String(20), default="running") # running | success | failed + simulated: Mapped[bool] = mapped_column(Boolean, default=True) + log: Mapped[str] = mapped_column(Text, default="") + actor: Mapped[str] = mapped_column(String(100), default="") + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now) + finished_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + + +class AuditLog(Base): + __tablename__ = "audit_log" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + ts: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now, index=True) + actor: Mapped[str] = mapped_column(String(100), default="") + action: Mapped[str] = mapped_column(String(60)) + tenant_id: Mapped[str | None] = mapped_column(String(64), nullable=True, index=True) + detail: Mapped[str] = mapped_column(Text, default="") + + +class ChatMessage(Base): + __tablename__ = "chat_messages" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + tenant_id: Mapped[str] = mapped_column(ForeignKey("tenants.id", ondelete="CASCADE"), index=True) + role: Mapped[str] = mapped_column(String(20)) # user | assistant + content: Mapped[str] = mapped_column(Text, default="") + steps: Mapped[list | None] = mapped_column(JSON, nullable=True) # Tool-Aufrufe (Anzeige) + proposal: Mapped[dict | None] = mapped_column(JSON, nullable=True) # vorgeschlagene Änderung + proposal_status: Mapped[str] = mapped_column(String(20), default="") # "" | open | applied | rejected + usage: Mapped[dict | None] = mapped_column(JSON, nullable=True) # {"in":…, "out":…, "backend":…, "model":…} + created_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now) + + +class CoreRelease(Base): + """Vom Core-CI gemeldetes Release (Image-Tag). Wird geprüft, freigegeben und ausgerollt.""" + __tablename__ = "core_releases" + + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True) + sha: Mapped[str] = mapped_column(String(64), unique=True, index=True) + tag: Mapped[str] = mapped_column(String(100)) + ref: Mapped[str] = mapped_column(String(100), default="") + image: Mapped[str] = mapped_column(String(300), default="") + message: Mapped[str] = mapped_column(String(500), default="") + announced_at: Mapped[datetime] = mapped_column(DateTime(timezone=True), default=now) + # new → checked → approved → rolling → active (rejected / failed / superseded) + status: Mapped[str] = mapped_column(String(20), default="new") + compat: Mapped[dict | None] = mapped_column(JSON, nullable=True) # {checked_at, core_sha, tenants:{id:{status,…}}, summary:{…}} + approved_by: Mapped[str] = mapped_column(String(100), default="") + approved_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True), nullable=True) + previous_tag: Mapped[str] = mapped_column(String(100), default="") # aktiver Tag vor dem Rollout (für Rollback) + rollout_batch: Mapped[str] = mapped_column(String(40), default="") diff --git a/app/routers/__init__.py b/app/routers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/routers/api.py b/app/routers/api.py new file mode 100644 index 0000000..6f00559 --- /dev/null +++ b/app/routers/api.py @@ -0,0 +1,770 @@ +from __future__ import annotations + +import json +import re +import socket + +import hmac +import os + +from fastapi import APIRouter, Body, Depends, File, Header, HTTPException, Request, Response, UploadFile +from fastapi.responses import StreamingResponse +from pydantic import BaseModel +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.agent import loop as agent_loop +from app.agent.testrun import default_transcript, prompt_test +from app.agent.workspace import is_personal +from app.db import get_db, session +from app.deps import actor, tenant_or_404 +from app.models import Blob, ChatMessage, CoreRelease, Deployment, Secret, Setting, Tenant, Version +from app.services import contract, crypto, defaults, deploy, guard, llm, onyva_login, preflight, preview, releases, status as status_svc, store, tenants as tsvc + +router = APIRouter(prefix="/api") + + +def _iso(d): + return d.isoformat() if d else None + + +# ── Tenants ───────────────────────────────────────────────────────────────── + +class NewTenant(BaseModel): + id: str + name: str + clone_from: str | None = None + + +@router.post("/tenants") +def create_tenant(body: NewTenant, db: Session = Depends(get_db), who: str = Depends(actor)): + try: + t = tsvc.create(db, body.id, body.name, body.clone_from or None, who) + except ValueError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"id": t.id} + + +@router.get("/tenants/{tenant_id}/state") +def state(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + cfg, files = store.content(db, t, "draft") + meta = {p: {"size": db.get(Blob, sha).size, "text": store.is_text_path(p), "personal": is_personal(p)} for p, sha in files.items()} + return { + "id": t.id, "name": t.name, "status": t.status, "source": t.source, "notes": t.notes, + "has_draft": bool(t.draft), "current_version": t.current_version, "deployed_version": t.deployed_version, + "deployed_image": t.deployed_image, "config": cfg, "files": meta, + "host": deploy.host_for(db, t), "subdomain": t.subdomain, "custom_domain": t.custom_domain, + "domain_status": t.domain_status, "cpu": t.cpu, "memory": t.memory, + "base_domain": deploy.setting(db, "base_domain", "example.de"), + "color_labels": defaults.COLOR_LABELS, "core_version": preview.core_version(), + "sample": preview.sample_for(t), "has_custom_sample": bool(t.preview_sample), + "sample_transcript": default_transcript(t.id), "llm_ready": llm.configured(db, t.id), + "core": {"tag": deploy.effective_tag(db, t), "pin": t.core_pin, "sha": contract.sha()[:10], "contract_ok": contract.supported()}, + "schema_problems": contract.check_tenant_json(cfg), + } + + +@router.put("/tenants/{tenant_id}/meta") +def put_meta(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + if "cpu" in body: + cpu = float(body["cpu"]) + if not 0.1 <= cpu <= 8: + raise HTTPException(400, "CPU zwischen 0,1 und 8") + t.cpu = cpu + if "memory" in body: + if not re.fullmatch(r"\d{1,5}[MG]", str(body["memory"])): + raise HTTPException(400, "RAM z. B. 512M oder 1G") + t.memory = str(body["memory"]) + if "status" in body: + if body["status"] not in ("active", "paused", "archived"): + raise HTTPException(400, "status: active | paused | archived") + t.status = body["status"] + if "notes" in body: + t.notes = str(body["notes"])[:5000] + store.audit(db, who, "tenant.meta", t.id, ", ".join(body)) + db.commit() + return {"ok": True} + + +@router.delete("/tenants/{tenant_id}") +def delete_tenant(confirm: str = "", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + """Löscht nur die Datenbank-Einträge. Infrastruktur (Container/Ingress) vorher per Offboard entfernen.""" + if t.status != "archived": + raise HTTPException(400, "Nur archivierte Tenants können gelöscht werden.") + if confirm != t.id: + raise HTTPException(400, "Bestätigung: ID des Tenants angeben.") + for model in (Secret, Version, ChatMessage): + for row in db.scalars(select(model).where(model.tenant_id == t.id)): + db.delete(row) + store.audit(db, who, "tenant.delete", t.id) + db.delete(t) + db.commit() + return {"ok": True} + + +@router.put("/tenants/{tenant_id}/config") +def put_config(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + store.set_config(db, t, body) + db.commit() + return {"has_draft": bool(t.draft)} + + +@router.get("/tenants/{tenant_id}/files/{path:path}") +def get_file(path: str, source: str = "draft", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + try: + _, files = preview.resolve_content(db, t, source) + except preview.SourceGone: + _, files = store.content(db, t, "draft") + if path not in files: + from app.settings import PLATFORM_DIR + for base in ("defaults", "templates"): + p = PLATFORM_DIR / "core" / base / path + if p.exists() and p.is_file(): + return Response(p.read_bytes(), headers={"X-Default": "1"}, media_type="text/plain; charset=utf-8") + raise HTTPException(404, "Datei nicht vorhanden") + data = store.get_blob(db, files[path]) + mt = "image/svg+xml" if path.endswith(".svg") else "image/png" if path.endswith(".png") else \ + "application/pdf" if path.endswith(".pdf") else "text/plain; charset=utf-8" + return Response(data, media_type=mt) + + +@router.put("/tenants/{tenant_id}/files/{path:path}") +def put_file(path: str, body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + try: + if path.endswith(".py"): + compile(body.get("content", ""), path, "exec") + store.set_file(db, t, path, body.get("content", "").encode("utf-8")) + except SyntaxError as exc: + raise HTTPException(400, f"Python-Syntaxfehler in Zeile {exc.lineno}: {exc.msg}") + except ValueError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"has_draft": bool(t.draft)} + + +@router.post("/tenants/{tenant_id}/upload") +async def upload(file: UploadFile = File(...), path: str = "", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + data = await file.read() + if len(data) > 8 * 1024 * 1024: + raise HTTPException(413, "Datei größer als 8 MB") + try: + store.set_file(db, t, path or file.filename, data) + except ValueError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"ok": True} + + +@router.delete("/tenants/{tenant_id}/files/{path:path}") +def del_file(path: str, t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + store.delete_file(db, t, path) + db.commit() + return {"has_draft": bool(t.draft)} + + +@router.put("/tenants/{tenant_id}/sample") +def put_sample(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + t.preview_sample = body.get("sample") or None + db.commit() + return {"ok": True} + + +@router.post("/tenants/{tenant_id}/draft/discard") +def discard(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + store.discard_draft(db, t) + store.audit(db, who, "draft.discard", t.id) + db.commit() + return {"ok": True} + + +@router.get("/tenants/{tenant_id}/diff") +def diff(a: str = "current", b: str = "draft", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + return store.diff_summary(db, t, a, b, with_text=True) + + +class PublishBody(BaseModel): + message: str = "" + + +@router.post("/tenants/{tenant_id}/publish") +def publish(body: PublishBody, t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + try: + v = store.publish(db, t, body.message, who) + except ValueError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"version": v.number} + + +@router.post("/tenants/{tenant_id}/validate") +def validate(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), source: str = "draft"): + try: + res = dict(preview.run(db, t, source, "validate")) + except (preview.PreviewError, preview.SourceGone) as exc: + return {"ok": False, "errors": [str(exc)], "warnings": []} + cfg, _ = preview.resolve_content(db, t, source) + res["warnings"] = [*res.get("warnings", []), *(f"Schema: {p}" for p in contract.check_tenant_json(cfg))] # unbekannte Optionen/Typfehler (Tippfehler) + return res + + +@router.get("/tenants/{tenant_id}/versions") +def versions(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + out = [] + for v in db.scalars(select(Version).where(Version.tenant_id == t.id).order_by(Version.number.desc())): + out.append({"number": v.number, "message": v.message, "author": v.author, "created_at": _iso(v.created_at), + "files": len(v.files), "current": v.number == t.current_version, "deployed": v.number == t.deployed_version}) + return out + + +@router.post("/tenants/{tenant_id}/versions/{number}/restore") +def restore(number: int, t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + try: + store.restore_as_draft(db, t, number) + except KeyError: + raise HTTPException(404, "Version nicht gefunden") + store.audit(db, who, "version.restore_draft", t.id, f"v{number}") + db.commit() + return {"has_draft": bool(t.draft)} + + +# ── Prompt-Test & LLM ─────────────────────────────────────────────────────── + +@router.post("/tenants/{tenant_id}/prompt-test") +def prompt_test_ep(body: dict = Body(default={}), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + """Echter LLM-Lauf mit dem (Entwurfs-)Prompt auf einem Beispieltranskript. Kostet Cortecs-Guthaben.""" + cfg, files = store.content(db, t, body.get("source", "draft")) + try: + r = prompt_test(db, t, cfg, files, body.get("transcript"), body.get("terminart", ""), body.get("projekt", ""), body.get("kunde", "")) + except llm.LLMNotConfigured as exc: + raise HTTPException(400, str(exc)) + except preview.PreviewError as exc: + raise HTTPException(422, f"Core-Rendering fehlgeschlagen: {str(exc)[-600:]}") + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, f"LLM-Aufruf fehlgeschlagen: {type(exc).__name__}: {str(exc)[:300]}") + store.audit(db, who, "prompt.test", t.id, f"{r['model']} {r['input_tokens']}→{r['output_tokens']} Tokens") + db.commit() + return r + + +@router.get("/tenants/{tenant_id}/final-prompt") +def final_prompt(source: str = "draft", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + """Finaler System-Prompt, wie der Core ihn an das LLM schickt (Platzhalter ersetzt, Hooks angewandt).""" + try: + return preview.run(db, t, source, "prompt", args={"title": "Beispiel", "terminart": "", "projekt": "", "kunde": ""}) + except preview.PreviewError as exc: + raise HTTPException(422, str(exc)[-800:]) + + +@router.get("/llm/status") +def llm_status(tenant: str = "", db: Session = Depends(get_db)): + key, source, error = llm.key_info(db, tenant or None) + return {"configured": bool(key), "source": source, "error": error, "model": deploy.setting(db, "agent_model", "claude-4-6-sonnet"), + "api": deploy.setting(db, "agent_api", "messages"), "base_url": llm.base_url(db)} + + +@router.get("/llm/models") +def llm_models(db: Session = Depends(get_db)): + try: + return llm.list_models(db) + except llm.LLMNotConfigured as exc: + raise HTTPException(400, str(exc)) + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, f"Modellliste nicht abrufbar: {type(exc).__name__}: {str(exc)[:200]}") + + +# ── Domain, Secrets, Quelle ───────────────────────────────────────────────── + +@router.put("/tenants/{tenant_id}/domain") +def put_domain(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + sub = (body.get("subdomain") or "").strip().lower() + custom = (body.get("custom_domain") or "").strip().lower() + if sub and not re.fullmatch(r"[a-z0-9]([a-z0-9-]{0,60}[a-z0-9])?", sub): + raise HTTPException(400, "Subdomain: a-z, 0-9, Bindestrich") + if custom and not re.fullmatch(r"([a-z0-9-]+\.)+[a-z]{2,}", custom): + raise HTTPException(400, "Eigene Domain ungültig") + t.subdomain = sub or t.subdomain + if custom != t.custom_domain: + t.custom_domain = custom + t.domain_status = "pending" if custom else ("verified" if t.source == "git" else "none") + store.audit(db, who, "domain.set", t.id, f"{t.subdomain} / {custom or '–'}") + db.commit() + return {"host": deploy.host_for(db, t), "domain_status": t.domain_status} + + +@router.post("/tenants/{tenant_id}/domain/check") +def check_domain(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + host = t.custom_domain or deploy.host_for(db, t) + try: + ips = sorted({ai[4][0] for ai in socket.getaddrinfo(host, 443, type=socket.SOCK_STREAM)}) + except OSError: + ips = [] + if ips: + t.domain_status = "verified" + msg = f"{host} löst auf {', '.join(ips)} auf. (Die Ziel-Prüfung gegen das Mittwald-Projekt folgt mit dem Live-Deploy.)" + else: + t.domain_status = "pending" if t.custom_domain else t.domain_status + msg = f"{host} löst noch nicht auf. DNS-Einträge prüfen; Änderungen können bis zu 24 h dauern." + db.commit() + return {"status": t.domain_status, "message": msg} + + +# ── OIDC-Client (Developer-API von login.onyva.dev) ───────────────────────── + +def _oidc_view(db: Session, t: Tenant) -> dict: + cfg = onyva_login.config_of(t) + cid = db.scalar(select(Secret).where(Secret.tenant_id == t.id, Secret.key == "OIDC_CLIENT_ID")) + sec = db.scalar(select(Secret).where(Secret.tenant_id == t.id, Secret.key == "OIDC_CLIENT_SECRET")) + base = deploy.setting(db, "base_domain", "example.de") + return {**cfg, "client_id": crypto.decrypt(cid.value_enc) if cid and cid.value_enc else None, "secret_set": bool(sec and sec.value_enc), + "redirect_uris": onyva_login.desired_redirects(base, t), "api_key": onyva_login.key_present(), "writes_allowed": onyva_login.writes_allowed(), + "api_base": onyva_login.base_url(db)} + + +@router.get("/tenants/{tenant_id}/oidc") +def oidc_get(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + return _oidc_view(db, t) + + +@router.put("/tenants/{tenant_id}/oidc") +def oidc_put(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + try: + new = onyva_login.validate_config({**onyva_login.config_of(t), **body}) + except ValueError as exc: + raise HTTPException(400, str(exc)) + new["last_sync"] = onyva_login.config_of(t)["last_sync"] + t.oidc = new + store.audit(db, who, "oidc.config", t.id, f"mode={new['mode']} auth={new['auth_mode']} members={len(new['members'])}") + db.commit() + return _oidc_view(db, t) + + +@router.post("/tenants/{tenant_id}/oidc/sync") +def oidc_sync(body: dict = Body(default={}), t: Tenant = Depends(tenant_or_404), who: str = Depends(actor)): + """apply=false: nur lesen und Plan zeigen. apply=true: schreiben (nur mit OIDC_SYNC_LIVE/DEPLOY_LIVE).""" + apply = bool(body.get("apply")) + if apply and not guard.live_allowed(t.id): + raise HTTPException(403, guard.denial(t.id)) + if apply and not onyva_login.writes_allowed(): + raise HTTPException(403, "Schreibzugriffe auf das Login-System sind gesperrt (Env OIDC_SYNC_LIVE oder DEPLOY_LIVE ≠ true). Plan (Dry-Run) ist möglich.") + lines: list[str] = [] + rep = onyva_login.sync_tenant(t.id, apply=apply, log=lines.append, rotate=bool(body.get("rotate")), actor=who) + return {**rep, "log": lines} + + +@router.post("/tenants/{tenant_id}/oidc/import-members") +def oidc_import_members(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + """Liest die aktuellen Freigaben aus dem Login und übernimmt sie als Soll-Liste (nur lesender API-Zugriff).""" + client = onyva_login.client_from_env(db) + cid = db.scalar(select(Secret).where(Secret.tenant_id == t.id, Secret.key == "OIDC_CLIENT_ID")) + if client is None: + raise HTTPException(400, "ONYVA_LOGIN_API_KEY ist nicht gesetzt.") + if not (cid and cid.value_enc): + raise HTTPException(400, "Tenant hat noch keine OIDC_CLIENT_ID.") + try: + ms = client.memberships(crypto.decrypt(cid.value_enc)) + except onyva_login.OnyvaError as exc: + raise HTTPException(502, str(exc)) + cfg = onyva_login.config_of(t) + cfg["members"] = [{"email": m["email"], "role": m.get("role", "viewer")} for m in ms] + t.oidc = {**cfg, "last_sync": cfg["last_sync"]} + store.audit(db, who, "oidc.import_members", t.id, f"{len(ms)} Freigaben") + db.commit() + return _oidc_view(db, t) + + +@router.delete("/tenants/{tenant_id}/oidc/app") +def oidc_delete_app(confirm: str = "", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + """Löscht den OIDC-Client im Login (nicht umkehrbar, beendet alle Logins dieser App).""" + if confirm != t.id: + raise HTTPException(400, "Bestätigung: ID des Tenants angeben.") + if not onyva_login.writes_allowed(): + raise HTTPException(403, "Schreibzugriffe auf das Login-System sind gesperrt.") + if not guard.live_allowed(t.id): + raise HTTPException(403, guard.denial(t.id)) + client = onyva_login.client_from_env(db) + cid = db.scalar(select(Secret).where(Secret.tenant_id == t.id, Secret.key == "OIDC_CLIENT_ID")) + if client is None or not (cid and cid.value_enc): + raise HTTPException(400, "Kein API-Key oder keine Client-ID vorhanden.") + try: + client.delete_app(crypto.decrypt(cid.value_enc)) + except onyva_login.OnyvaError as exc: + raise HTTPException(502, str(exc)) + for key in ("OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET"): + tsvc.set_secret(db, t.id, key, None, who) + store.audit(db, who, "oidc.app_deleted", t.id) + db.commit() + return _oidc_view(db, t) + + +@router.get("/oidc/status") +def oidc_status(db: Session = Depends(get_db)): + return {"api_key": onyva_login.key_present(), "writes_allowed": onyva_login.writes_allowed(), "api_base": onyva_login.base_url(db)} + + +@router.post("/oidc/test") +def oidc_test(db: Session = Depends(get_db)): + client = onyva_login.client_from_env(db) + if client is None: + raise HTTPException(400, "ONYVA_LOGIN_API_KEY ist nicht gesetzt.") + try: + apps = client.list_apps() + except onyva_login.OnyvaError as exc: + raise HTTPException(502, str(exc)) + except Exception as exc: # noqa: BLE001 + raise HTTPException(502, f"Login-API nicht erreichbar: {type(exc).__name__}: {str(exc)[:200]}") + return {"ok": True, "apps": len(apps)} + + +@router.get("/tenants/{tenant_id}/secrets") +def secrets_list(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + return tsvc.secret_rows(db, t.id) + + +@router.put("/tenants/{tenant_id}/secrets/{key}") +def secret_put(key: str, body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + value = body.get("value") + if body.get("generate"): + value = defaults.new_token() + try: + tsvc.set_secret(db, t.id, key, value, who) + except ValueError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"ok": True} + + +@router.put("/tenants/{tenant_id}/source") +def set_source(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + src = body.get("source") + if src not in ("git", "admin"): + raise HTTPException(400, "source: git | admin") + t.source = src + store.audit(db, who, "tenant.source", t.id, f"TENANT_SOURCE={src}") + db.commit() + return {"source": t.source} + + +@router.get("/tenants/{tenant_id}/cutover") +def cutover(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + try: + val = preview.run(db, t, "current", "validate") + except preview.PreviewError: + val = {"ok": False} + return {"checks": tsvc.cutover_checks(db, t, val), "source": t.source} + + +# ── Deploy ────────────────────────────────────────────────────────────────── + +def _dep(d: Deployment): + return {"id": d.id, "batch": d.batch_id, "tenant": d.tenant_id, "kind": d.kind, "version": d.version, + "image": d.image_tag, "status": d.status, "simulated": d.simulated, "log": d.log, "actor": d.actor, + "created_at": _iso(d.created_at), "finished_at": _iso(d.finished_at)} + + +@router.get("/deploy/mode") +def deploy_mode(db: Session = Depends(get_db)): + return {"live": deploy.live_enabled(), "token": deploy.token_present(), "allowed": guard.describe(), "project": bool(deploy.setting(db, "mittwald_project_id")), + "core_bundle": deploy.setting(db, "core_supports_bundle", "false") == "true"} + + +@router.get("/tenants/{tenant_id}/preflight") +def tenant_preflight(t: Tenant = Depends(tenant_or_404)): + """Vorflug-Check für einen Live-Deploy (liest nur, schreibt nichts).""" + return preflight.run(t.id) + + +@router.get("/tenants/{tenant_id}/plan") +def plan(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + return deploy.plan(db, t) + + +def _kind(body: dict, base: str, tenant_id: str | None = None) -> str: + dry = bool(body.get("dry_run")) + if not dry and not deploy.live_enabled(): + raise HTTPException(403, "Echte Deployments sind gesperrt (Env DEPLOY_LIVE != true). Nur Dry-Run möglich.") + if not dry and tenant_id and not guard.live_allowed(tenant_id): + raise HTTPException(403, guard.denial(tenant_id)) + return f"{base}-dry" if base == "offboard" and dry else ("dry-run" if dry else base) + + +@router.post("/tenants/{tenant_id}/deploy") +def deploy_ep(body: dict = Body(default={}), t: Tenant = Depends(tenant_or_404), who: str = Depends(actor)): + return {"id": deploy.start(t.id, _kind(body, "deploy", t.id), who)} + + +@router.post("/tenants/{tenant_id}/offboard") +def offboard_ep(body: dict = Body(default={}), t: Tenant = Depends(tenant_or_404), who: str = Depends(actor)): + return {"id": deploy.start(t.id, _kind(body, "offboard", t.id), who)} + + +@router.post("/deploy-all") +def deploy_all(body: dict = Body(default={}), who: str = Depends(actor)): + batch, ids = deploy.start_all(_kind(body, "deploy"), who) + return {"batch": batch, "ids": ids} + + +@router.get("/deployments/{dep_id}") +def deployment(dep_id: int, db: Session = Depends(get_db)): + d = db.get(Deployment, dep_id) + if d is None: + raise HTTPException(404) + return _dep(d) + + +@router.get("/deployments") +def deployments(batch: str = "", db: Session = Depends(get_db)): + q = select(Deployment).order_by(Deployment.id.desc()).limit(60) + if batch: + q = select(Deployment).where(Deployment.batch_id == batch).order_by(Deployment.id) + return [_dep(d) for d in db.scalars(q)] + + +# ── Core: Vertrag, Releases, Rollout, Zustand ─────────────────────────────── + +@router.get("/contract") +def contract_info(): + return {"available": contract.available(), "supported": contract.supported(), "manifest": contract.manifest(), "schema": contract.schema(), + "supported_versions": sorted(contract.SUPPORTED_CONTRACT)} + + +def _require_session(request: Request) -> None: + if not getattr(request.state, "user", None): + raise HTTPException(401, "Nicht angemeldet") + + +@router.post("/core/releases") +def core_release_intake(request: Request, body: dict = Body(...), authorization: str = Header(default=""), db: Session = Depends(get_db)): + """Release-Eingang für die Core-CI (Bearer CORE_RELEASE_TOKEN). Meldet nur an – ausgerollt wird erst nach Prüfung und Freigabe.""" + expected = os.getenv("CORE_RELEASE_TOKEN", "").strip() + if not expected: + raise HTTPException(503, "Release-Eingang nicht konfiguriert (Env CORE_RELEASE_TOKEN fehlt).") + if not hmac.compare_digest(authorization.removeprefix("Bearer ").strip(), expected): + raise HTTPException(401, "Ungültiges Token") + try: + r, created = releases.announce(db, str(body.get("sha", "")), body.get("tag"), str(body.get("ref", "")), str(body.get("image", "")), str(body.get("message", ""))) + except releases.ReleaseError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"id": r.id, "created": created, "status": r.status, "admin_matches": releases.admin_matches(r)} + + +@router.get("/core/releases") +def core_releases(request: Request, db: Session = Depends(get_db)): + _require_session(request) + active = deploy.setting(db, "core_image_tag", "latest") + rows = db.scalars(select(CoreRelease).order_by(CoreRelease.id.desc()).limit(40)).all() + return {"admin_core": {**contract.build_info(), "contract": contract.contract_version(), "supported": contract.supported(), + "schema_sha": contract.manifest().get("schema_sha256"), "fields": contract.manifest().get("fields"), + "env": contract.manifest().get("env")}, + "active_tag": active, "canary": releases.canary_list(db), "live": deploy.live_enabled(), + "intake": bool(os.getenv("CORE_RELEASE_TOKEN", "").strip()), "releases": [releases.view(r, active) for r in rows]} + + +@router.post("/core/releases/{release_id}/check") +def core_check(release_id: int, body: dict = Body(default={})): + try: + releases.check(release_id, force=bool(body.get("force"))) + except releases.ReleaseError as exc: + raise HTTPException(400, str(exc)) + return {"started": True} + + +@router.post("/core/releases/{release_id}/approve") +def core_approve(release_id: int, body: dict = Body(default={}), db: Session = Depends(get_db), who: str = Depends(actor)): + try: + releases.approve(db, release_id, who, bool(body.get("acknowledge"))) + except releases.ReleaseError as exc: + raise HTTPException(400, str(exc)) + db.commit() + return {"ok": True} + + +@router.post("/core/releases/{release_id}/reject") +def core_reject(release_id: int, db: Session = Depends(get_db), who: str = Depends(actor)): + r = db.get(CoreRelease, release_id) + if r is None: + raise HTTPException(404) + r.status = "rejected" + store.audit(db, who, "core.reject", None, r.sha[:10]) + db.commit() + return {"ok": True} + + +@router.post("/core/releases/{release_id}/rollout") +def core_rollout(release_id: int, body: dict = Body(default={}), who: str = Depends(actor)): + try: + batch, ids = releases.rollout(release_id, who, dry_run=bool(body.get("dry_run", True))) + except releases.ReleaseError as exc: + raise HTTPException(403 if "gesperrt" in str(exc) else 400, str(exc)) + return {"batch": batch, "ids": ids} + + +@router.post("/core/releases/{release_id}/rollback") +def core_rollback(release_id: int, who: str = Depends(actor)): + try: + batch, ids = releases.rollback_release(release_id, who) + except releases.ReleaseError as exc: + raise HTTPException(403 if "gesperrt" in str(exc) else 400, str(exc)) + return {"batch": batch, "ids": ids} + + +@router.put("/tenants/{tenant_id}/core-pin") +def tenant_pin(body: dict = Body(...), t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + pin = (body.get("pin") or "").strip() or None + if pin and not re.fullmatch(r"[A-Za-z0-9_.-]{1,100}", pin): + raise HTTPException(400, "Tag: Buchstaben, Ziffern, . _ -") + t.core_pin = pin + store.audit(db, who, "tenant.core_pin", t.id, pin or "aufgehoben") + db.commit() + return {"pin": t.core_pin} + + +@router.post("/tenants/{tenant_id}/rollback") +def tenant_rollback(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + if not deploy.live_enabled(): + raise HTTPException(403, "Echte Deployments sind gesperrt (DEPLOY_LIVE != true).") + if not guard.live_allowed(t.id): + raise HTTPException(403, guard.denial(t.id)) + tag = releases.tenant_rollback_tag(db, t) + if not tag: + raise HTTPException(400, "Kein früherer, erfolgreich deployter Core-Tag bekannt.") + return {"id": deploy.start(t.id, "deploy", who, core_tag=tag), "tag": tag} + + +@router.get("/status") +def tenants_status(refresh: bool = False): + """Was läuft wirklich? Fragt /health jedes aktiven Tenants ab (30 s Cache).""" + return status_svc.probe_all(refresh=refresh) + + +# ── Einstellungen ─────────────────────────────────────────────────────────── + +@router.get("/settings") +def get_settings(db: Session = Depends(get_db)): + return {s.key: s.value for s in db.scalars(select(Setting))} + + +@router.put("/settings") +def put_settings(body: dict = Body(...), db: Session = Depends(get_db), who: str = Depends(actor)): + for k, v in body.items(): + s = db.get(Setting, k) + if s is None: + s = Setting(key=k) + db.add(s) + s.value = str(v) + store.audit(db, who, "settings.update", None, ", ".join(body)) + db.commit() + return {"ok": True} + + +@router.put("/shared-secrets/{key}") +def shared_secret(key: str, body: dict = Body(...), db: Session = Depends(get_db), who: str = Depends(actor)): + r = db.scalar(select(Secret).where(Secret.tenant_id.is_(None), Secret.key == key)) + if r is None: + r = Secret(tenant_id=None, key=key) + db.add(r) + r.value_enc = crypto.encrypt(body["value"]) if body.get("value") else None + r.source = "manual" + store.audit(db, who, "shared-secret.set", None, key) + db.commit() + return {"ok": True} + + +# ── Agent ─────────────────────────────────────────────────────────────────── + +def _msg(m: ChatMessage): + return {"id": m.id, "role": m.role, "content": m.content, "steps": m.steps or [], "proposal": m.proposal, + "proposal_status": m.proposal_status, "usage": m.usage, "created_at": _iso(m.created_at)} + + +@router.get("/tenants/{tenant_id}/chat") +def chat_history(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + return [_msg(m) for m in db.scalars(select(ChatMessage).where(ChatMessage.tenant_id == t.id).order_by(ChatMessage.id))] + + +def _sse(ev: dict) -> str: + return f"data: {json.dumps(ev, ensure_ascii=False)}\n\n" + + +@router.post("/tenants/{tenant_id}/chat") +def chat(tenant_id: str, body: dict = Body(...), who: str = Depends(actor)): + """Agent-Lauf als Server-Sent-Events: mode, step*, thought*, text, proposal, usage, done.""" + text = (body.get("message") or "").strip() + if not text: + raise HTTPException(400, "Leere Nachricht") + + def gen(): + with session() as db: + t = db.get(Tenant, tenant_id) + steps, final, proposal, usage, mode, error = [], "", None, None, {}, None + for ev in agent_loop.run(db, t, text): + if ev["type"] == "step": + steps.append({k: ev[k] for k in ("tool", "arg", "result", "error")}) + elif ev["type"] == "text": + final = ev["text"] + elif ev["type"] == "proposal": + proposal = ev["proposal"] + elif ev["type"] == "usage": + usage = ev["usage"] + elif ev["type"] == "mode": + mode = ev + elif ev["type"] == "error": + error = ev["text"] + yield _sse(ev if ev["type"] != "proposal" else {"type": "proposal", "summary": (proposal or {}).get("summary"), + "items": (proposal or {}).get("items", [])}) + db.add(ChatMessage(tenant_id=tenant_id, role="user", content=text)) + m = ChatMessage(tenant_id=tenant_id, role="assistant", content=error and f"⚠ {error}" or final, steps=steps, proposal=proposal, + proposal_status="open" if proposal else "", + usage={**(usage or {}), "backend": mode.get("backend"), "model": mode.get("model")}) + db.add(m) + store.audit(db, who, "agent.run", tenant_id, f"{mode.get('backend')}/{mode.get('model')} {text[:80]}") + db.commit() + yield _sse({"type": "done", "message": _msg(m)}) + + return StreamingResponse(gen(), media_type="text/event-stream", headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}) + + +@router.get("/tenants/{tenant_id}/chat/{msg_id}/diff") +def chat_diff(msg_id: int, t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + m = db.get(ChatMessage, msg_id) + if m is None or m.tenant_id != t.id or not m.proposal: + raise HTTPException(404) + return store.diff_content(db, store.content(db, t, "draft"), agent_loop.proposal_content(db, t, m.proposal), with_text=True) + + +@router.post("/tenants/{tenant_id}/chat/{msg_id}/{decision}") +def chat_decide(msg_id: int, decision: str, t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), who: str = Depends(actor)): + m = db.get(ChatMessage, msg_id) + if m is None or m.tenant_id != t.id or m.proposal_status != "open": + raise HTTPException(400, "Kein offener Vorschlag") + if decision == "apply": + agent_loop.apply_proposal(db, t, m.proposal) + m.proposal_status = "applied" + store.audit(db, "agent", "agent.proposal.apply", t.id, f"freigegeben von {who}: {(m.proposal or {}).get('summary')}") + elif decision == "reject": + m.proposal_status = "rejected" + else: + raise HTTPException(400) + db.commit() + return _msg(m) + + +@router.delete("/tenants/{tenant_id}/chat") +def chat_clear(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + for m in db.scalars(select(ChatMessage).where(ChatMessage.tenant_id == t.id)): + db.delete(m) + db.commit() + return {"ok": True} + + +# ── Bundle: genau das holt ein Tenant-Container beim Start ────────────────── + +@router.get("/tenants/{tenant_id}/bundle") +def bundle(tenant_id: str, authorization: str = Header(default=""), db: Session = Depends(get_db)): + token = authorization.removeprefix("Bearer ").strip() + if not tsvc.check_bundle_token(db, tenant_id, token): + raise HTTPException(401, "Ungültiges Bundle-Token") + t = db.get(Tenant, tenant_id) + data, manifest = store.bundle_tar(db, t, "current") + return Response(data, media_type="application/gzip", headers={"X-Bundle-Version": str(t.current_version), "ETag": f'"{t.current_version}"'}) diff --git a/app/routers/pages.py b/app/routers/pages.py new file mode 100644 index 0000000..76d89ad --- /dev/null +++ b/app/routers/pages.py @@ -0,0 +1,107 @@ +from __future__ import annotations + +import re + +from fastapi import APIRouter, Depends, HTTPException, Request, Response +from fastapi.responses import HTMLResponse +from sqlalchemy import func, select +from sqlalchemy.orm import Session + +from app.db import get_db +from app.deps import tenant_or_404 +from app.models import AuditLog, Deployment, Secret, Setting, Tenant +from app.services import deploy, guard, onyva_login, preview, store +from app.services.importer import DEFAULT_SETTINGS +from app.templating import templates + +router = APIRouter() + + +def _logo(db, t: Tenant, source="current") -> str | None: + _, files = store.content(db, t, source) + for name in ("logo.svg", "logo.png"): + if name in files: + return f"/api/tenants/{t.id}/files/{name}?source={source}" + return None + + +@router.get("/", response_class=HTMLResponse) +def dashboard(request: Request, db: Session = Depends(get_db)): + rows = [] + for t in db.scalars(select(Tenant).order_by(Tenant.id)): + cfg, files = store.content(db, t, "current") + missing = db.scalar(select(func.count()).select_from(Secret).where(Secret.tenant_id == t.id, Secret.value_enc.is_(None))) or 0 + rows.append({ + "t": t, "cfg": cfg, "accent": (cfg.get("colors") or {}).get("accent", "#327F24"), + "logo": _logo(db, t), "host": deploy.host_for(db, t), "outdated": t.deployed_version != t.current_version, + "missing_secrets": missing, "stt": (cfg.get("stt") or {}).get("provider", "mistral"), + "has_code": "overrides.py" in files, "custom_prompt": "prompt.txt" in files, + "custom_pdf": "protocol.html" in files or "protocol.css" in files, + }) + stats = { + "tenants": len(rows), "admin": sum(1 for r in rows if r["t"].source == "admin"), + "drafts": sum(1 for r in rows if r["t"].draft), "outdated": sum(1 for r in rows if r["outdated"]), + "secrets": sum(1 for r in rows if r["missing_secrets"]), + } + last = db.scalars(select(Deployment).order_by(Deployment.id.desc()).limit(5)).all() + return templates.TemplateResponse(request, "dashboard.html", { + "rows": rows, "stats": stats, "last": last, "core": preview.core_version(), + "tag": deploy.setting(db, "core_image_tag", "latest"), "nav": "dashboard"}) + + +@router.get("/tenants/{tenant_id}", response_class=HTMLResponse) +def tenant_page(request: Request, t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + return templates.TemplateResponse(request, "tenant.html", {"t": t, "nav": "dashboard", "logo": _logo(db, t, "draft")}) + + +@router.get("/tenants/{tenant_id}/bundle.tar.gz") +def bundle_download(t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db), source: str = "current"): + data, _ = store.bundle_tar(db, t, source) + return Response(data, media_type="application/gzip", + headers={"Content-Disposition": f'attachment; filename="{t.id}-v{t.current_version}.tar.gz"'}) + + +@router.get("/preview/{tenant_id}/{kind}") +def preview_view(kind: str, source: str = "draft", t: Tenant = Depends(tenant_or_404), db: Session = Depends(get_db)): + if kind not in ("web", "pdf"): + raise HTTPException(404) + try: + data = preview.run(db, t, source, "index" if kind == "web" else "pdf") + except (preview.PreviewError, preview.SourceGone) as exc: + return Response(str(exc), status_code=422, media_type="text/plain; charset=utf-8") + if kind == "pdf": + return Response(data, media_type="application/pdf", headers={"Content-Disposition": "inline"}) + html = data.decode("utf-8") + # PNG-Logos referenziert der Core über /brand/logo → auf die Admin-Datei umbiegen + html = html.replace('src="/brand/logo"', f'src="/api/tenants/{t.id}/files/logo.png?source={source}"') + html = html.replace("", "", 1) + return HTMLResponse(html) + + +@router.get("/deployments", response_class=HTMLResponse) +def deployments_page(request: Request, db: Session = Depends(get_db)): + tenants = db.scalars(select(Tenant).where(Tenant.status == "active").order_by(Tenant.id)).all() + return templates.TemplateResponse(request, "deployments.html", { + "tenants": tenants, "tag": deploy.setting(db, "core_image_tag", "latest"), "nav": "deployments"}) + + +@router.get("/settings", response_class=HTMLResponse) +def settings_page(request: Request, db: Session = Depends(get_db)): + values = {k: deploy.setting(db, k, "") for k in DEFAULT_SETTINGS} + shared = {s.key: bool(s.value_enc) for s in db.scalars(select(Secret).where(Secret.tenant_id.is_(None)))} + from app.services import llm + return templates.TemplateResponse(request, "settings.html", { + "v": values, "shared": shared, "core": preview.core_version(), "nav": "settings", + "llm_ready": llm.configured(db), "mode": {"live": deploy.live_enabled(), "token": deploy.token_present(), "allowed": guard.describe()}, + "oidc": {"api_key": onyva_login.key_present(), "writes_allowed": onyva_login.writes_allowed(), "api_base": onyva_login.base_url(db)}}) + + +@router.get("/audit", response_class=HTMLResponse) +def audit_page(request: Request, db: Session = Depends(get_db)): + rows = db.scalars(select(AuditLog).order_by(AuditLog.id.desc()).limit(200)).all() + return templates.TemplateResponse(request, "audit.html", {"rows": rows, "nav": "audit"}) + + +@router.get("/core", response_class=HTMLResponse) +def core_page(request: Request): + return templates.TemplateResponse(request, "core.html", {"nav": "core"}) diff --git a/app/services/__init__.py b/app/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/services/contract.py b/app/services/contract.py new file mode 100644 index 0000000..9be6d47 --- /dev/null +++ b/app/services/contract.py @@ -0,0 +1,125 @@ +"""Vertrag mit dem Core (siehe transkript-platform/docs/CONTRACT.md): Schema, Manifest, Build-Info, Env-Spezifikation. + +Gelesen wird aus dem Core, auf dem die Admin-Plattform läuft (PLATFORM_DIR: im Container das Core-Image, lokal der vendored Stand). +`core/contract.py` ist import-sicher (nur Standardbibliothek) und wird per Dateipfad geladen – der Core-Code selbst wird NIE +in diesem Prozess importiert (er hält Prozess-Singletons); gerendert wird in der Sandbox. +Ältere Cores ohne Vertrag („legacy“) funktionieren weiter: Schema fehlt → feste Admin-Formulare und feste Env-Liste. +""" +from __future__ import annotations + +import importlib.util +import json +from functools import lru_cache +from pathlib import Path + +from app.settings import PLATFORM_DIR + +SUPPORTED_CONTRACT = {1} + +# Rückfall für Cores ohne Schema (entspricht dem Stand vor dem Vertrag) +LEGACY_SHARED_ENV = { + "OIDC_ISSUER": "oidc_issuer", "AUTH_ENABLED": "auth_enabled", "APP_COOKIE_SECURE": "app_cookie_secure", + "MAX_FILE_SIZE_MB": "max_file_size_mb", "LLM_MODEL": "llm_model", "LLM_MAX_TOKENS": "llm_max_tokens", + "LLM_TEMPERATURE": "llm_temperature", "CORTECS_BASE_URL": "cortecs_base_url", "SMTP_HOST": "smtp_host", + "SMTP_PORT": "smtp_port", "SMTP_USER": "smtp_user", "SMTP_FROM": "smtp_from", + "MISTRAL_TRANSCRIBE_MODEL": "mistral_transcribe_model", "MISTRAL_DIARIZE": "mistral_diarize", + "MISTRAL_TIMEOUT": "mistral_timeout", "COST_API_BASE": "cost_api_base", "COST_TRACKING_ENABLED": "cost_tracking_enabled", +} +LEGACY_REQUIRED_SECRETS = ["OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET", "SESSION_SECRET"] + + +@lru_cache(maxsize=1) +def _module(): + path = Path(PLATFORM_DIR) / "core" / "contract.py" + if not path.exists(): + return None + spec = importlib.util.spec_from_file_location("onyscribe_core_contract", path) + mod = importlib.util.module_from_spec(spec) + spec.loader.exec_module(mod) + return mod + + +def reload() -> None: + _module.cache_clear() + schema.cache_clear() + + +def available() -> bool: + return _module() is not None + + +@lru_cache(maxsize=1) +def schema() -> dict | None: + m = _module() + return m.load_schema() if m else None + + +def build_info() -> dict: + m = _module() + if m: + return m.build_info() + f = Path(PLATFORM_DIR) / "CORE_VERSION" + return {"sha": f.read_text().split()[0] if f.exists() else "unbekannt", "built_at": None, "source": "legacy"} + + +def manifest() -> dict: + m = _module() + if m: + return m.build_manifest() + return {"contract": 0, "core": build_info(), "legacy": True} + + +def contract_version() -> int: + return int(manifest().get("contract", 0)) + + +def supported() -> bool: + return (not available()) or contract_version() in SUPPORTED_CONTRACT + + +def sha() -> str: + return build_info()["sha"] + + +def same_sha(a: str, b: str) -> bool: + a, b = (a or "").lower(), (b or "").lower() + return bool(a and b) and (a.startswith(b) or b.startswith(a)) and min(len(a), len(b)) >= 7 + + +def check_tenant_json(raw: dict) -> list[str]: + m = _module() + return m.check_tenant_json(raw, schema()) if m else [] + + +def field_paths() -> set[str]: + s = schema() + return {f["path"] for f in s["fields"]} if s else set() + + +def env_spec() -> list[dict]: + s = schema() + if s: + return s["env"] + return [{"name": n, "kind": "setting", "scope": "shared", "setting": k, "default": None, "label": n, "group": "Allgemein"} for n, k in LEGACY_SHARED_ENV.items()] + + +def required_secrets(tenant_cfg: dict | None = None) -> list[str]: + """Pflicht-Secrets laut Schema (required, required_if wie „stt.provider!=cortecs“ gegen die Tenant-Config ausgewertet).""" + s = schema() + if not s: + return list(LEGACY_REQUIRED_SECRETS) + out = [] + for e in s["env"]: + if e["kind"] != "secret": + continue + if e.get("required"): + out.append(e["name"]) + elif e.get("required_if"): + path, _, rhs = e["required_if"].partition("!=") + cur = tenant_cfg or {} + for k in path.split("."): + cur = cur.get(k, {}) if isinstance(cur, dict) else {} + val = cur if isinstance(cur, str) else "" + if (val or "mistral") != rhs: # Provider-Standard ist mistral + out.append(e["name"]) + return out diff --git a/app/services/crypto.py b/app/services/crypto.py new file mode 100644 index 0000000..d988ccb --- /dev/null +++ b/app/services/crypto.py @@ -0,0 +1,15 @@ +from __future__ import annotations + +from cryptography.fernet import Fernet + +from app.settings import SECRET_KEY + +_f = Fernet(SECRET_KEY.encode()) + + +def encrypt(v: str) -> str: + return _f.encrypt(v.encode()).decode() + + +def decrypt(v: str) -> str: + return _f.decrypt(v.encode()).decode() diff --git a/app/services/defaults.py b/app/services/defaults.py new file mode 100644 index 0000000..7ff894d --- /dev/null +++ b/app/services/defaults.py @@ -0,0 +1,44 @@ +import json +import secrets + +# Standardfarben des Cores (core/config.py DEFAULT_COLORS) – Basis für neue Tenants +DEFAULT_COLORS = { + "accent": "#327F24", "accent_dark": "#235A19", "accent_mid": "#3E9130", "accent_light": "#EAF4E7", + "accent_xlight": "#F3FAF1", "bg": "#F1F5F0", "surface": "#FFFFFF", "surface2": "#F6FAF5", + "border": "#DCE8D9", "border2": "#BDD1B8", "text": "#444444", "text_2": "#666666", "text_3": "#9AA89A", + "red": "#DC2626", "progress_to": "#8bbf43", +} + +COLOR_LABELS = { + "accent": "Akzent", "accent_dark": "Akzent dunkel", "accent_mid": "Akzent mittel", "accent_light": "Akzent hell", + "accent_xlight": "Akzent extra hell", "bg": "Seitenhintergrund", "surface": "Karten", "surface2": "Karten 2", + "border": "Rahmen", "border2": "Rahmen 2", "text": "Text", "text_2": "Text sekundär", "text_3": "Text tertiär", + "red": "Rot (Hinweis)", "progress_to": "Fortschritt (Verlauf-Ende)", +} + +# Secret-Schlüssel = Env-Namen im Container (siehe infra/deploy.py) +REQUIRED_SECRETS = ["OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET", "SESSION_SECRET", "COST_INGEST_KEY"] +OPTIONAL_SECRETS = ["MISTRAL_API_KEY"] +SECRET_HELP = { + "OIDC_CLIENT_ID": "Client-ID aus login.onyva.dev (manuell angelegt)", + "OIDC_CLIENT_SECRET": "Client-Secret aus login.onyva.dev", + "SESSION_SECRET": "Signiert Session-Cookies – kann hier erzeugt werden", + "COST_INGEST_KEY": "Schlüssel für die Kostenerfassung (Cost-API)", + "MISTRAL_API_KEY": "Nur nötig bei STT-Provider „mistral“ (bei „cortecs“ wird der geteilte Key genutzt)", + "ADMIN_BUNDLE_TOKEN": "Token, mit dem der Container sein Bundle bei der Admin-Plattform abholt", +} + + +def new_token() -> str: + return secrets.token_urlsafe(48) + + +def skeleton_config(tenant_id: str, name: str) -> dict: + return { + "id": tenant_id, "name": name, "title": f"{name} – Gesprächsprotokoll", + "description": f"Gesprächsprotokoll-Tool für {name}", "ai_detect_org": name, + "org_short": name, "org_profile": "", + "flags": {}, "stt": {"provider": "cortecs", "model": "voxtral-mini-transcribe-2602"}, + "colors": dict(DEFAULT_COLORS), + "office": {"name": name, "subtitle": "", "address": "", "tel": "", "email": "", "website": ""}, + } diff --git a/app/services/deploy.py b/app/services/deploy.py new file mode 100644 index 0000000..7e8324f --- /dev/null +++ b/app/services/deploy.py @@ -0,0 +1,314 @@ +"""Deploy-Orchestrierung: Plan (wie infra/deploy.py), Ausführung über den Mittwald-Client. + +Sicherheit: Ohne `DEPLOY_LIVE=true` (Env der Admin-Plattform) ist JEDE schreibende Operation gesperrt – es gibt nur Dry-Runs. +Außerdem blockiert der Core-Kompatibilitäts-Schalter (`core_supports_bundle`) Tenants mit Quelle „Admin“, +solange der Core das Bundle noch nicht laden kann. +""" +from __future__ import annotations + +import os +import threading +import time +import uuid +from datetime import datetime, timezone + +from sqlalchemy import select + +from app.db import session +from app.models import Deployment, Secret, Setting, Tenant +from app.services import contract, crypto, guard, onyva_login, store +from app.services.mittwald import DeployError, Mittwald, mask_env + +PORT = "8276" + + +def live_enabled() -> bool: + return os.getenv("DEPLOY_LIVE", "false").lower() == "true" + + +def token_present() -> bool: + return bool(os.getenv("MITTWALD_API_TOKEN", "").strip()) + + +def setting(db, key: str, default: str = "") -> str: + s = db.get(Setting, key) + return s.value if s and s.value != "" else default + + +def host_for(db, t: Tenant) -> str: + if t.custom_domain and t.domain_status == "verified": + return t.custom_domain + return f"{t.subdomain or t.id}.{setting(db, 'base_domain', 'example.de')}" + + +def effective_tag(db, t: Tenant | None = None, override: str | None = None) -> str: + """Welcher Core-Tag gilt? Override (Rollout) > Pin des Tenants > freigegebener Standard-Tag.""" + return override or (t.core_pin if t is not None and t.core_pin else None) or setting(db, "core_image_tag", "latest") + + +def image_ref(db, t: Tenant | None = None, tag: str | None = None) -> str: + registry = setting(db, "registry", "").rstrip("/") + name = setting(db, "image_name", "transkript-platform") + base = f"{registry}/{name}" if registry else name + return f"{base.lower()}:{effective_tag(db, t, tag)}" + + +def build_env(db, t: Tenant, reveal: bool) -> dict[str, str]: + """Container-Env, abgeleitet aus dem Env-Schema des Cores (kind/scope) – neue Core-Variablen erscheinen ohne Admin-Änderung. + reveal=False → Secrets als Platzhalter.""" + host = host_for(db, t) + env = {"TENANT": t.id, "DATA_DIR": "/data", "PORT": PORT, + "OIDC_REDIRECT_URI": f"https://{host}/auth/callback", "OIDC_LOGOUT_REDIRECT_URI": f"https://{host}/"} + spec = contract.env_spec() + for e in spec: # geteilte, nicht geheime Einstellungen + if e["kind"] == "setting" and e["scope"] == "shared": + v = setting(db, e.get("setting") or e["name"].lower()) + if v: + env[e["name"]] = v + shared = db.scalars(select(Secret).where(Secret.tenant_id.is_(None))).all() + own = db.scalars(select(Secret).where(Secret.tenant_id == t.id)).all() + for s_ in [*shared, *own]: # Tenant-Werte überschreiben geteilte; auch Secrets ohne Schema-Eintrag werden durchgereicht + if s_.key == "ADMIN_BUNDLE_TOKEN" and t.source != "admin": + continue + if s_.value_enc: + env[s_.key] = crypto.decrypt(s_.value_enc) if reveal else "•••• gesetzt" + elif not reveal: + env[s_.key] = "⚠ fehlt (Wert noch nicht in der Admin-DB)" + if t.source == "admin": + env["TENANT_SOURCE"] = "admin" + env["ADMIN_URL"] = setting(db, "admin_public_url", "https://") + return env + + +def missing_secrets(db, t: Tenant) -> list[str]: + """Pflicht-Secrets laut Schema, die weder beim Tenant noch geteilt einen Wert haben.""" + cfg, _ = store.content(db, t, "current") + have = {s.key for s in db.scalars(select(Secret).where((Secret.tenant_id == t.id) | Secret.tenant_id.is_(None))) if s.value_enc} + need = set(contract.required_secrets(cfg)) + if t.source == "admin": + need.add("ADMIN_BUNDLE_TOKEN") + return sorted(need - have) + + +def plan(db, t: Tenant) -> dict: + cfg, _ = store.content(db, t, "current") + return { + "service": f"app-{t.id}", "volume": f"vol-{t.id}", + "patch": {"description": cfg.get("name") or f"Onyscribe {t.id}", "image": image_ref(db, t), + "environment": build_env(db, t, reveal=False), "ports": [f"{PORT}:{PORT}/tcp"], "volumes": [f"vol-{t.id}:/data"]}, + "ingress": {"host": host_for(db, t), "target": f"app-{t.id}:{PORT}"}, + "missing_secrets": missing_secrets(db, t), + "oidc": {"mode": onyva_login.config_of(t)["mode"], "key": onyva_login.key_present(), "writes": onyva_login.writes_allowed(), + "last_sync": onyva_login.config_of(t)["last_sync"]}, + "mode": {"live": live_enabled(), "token": token_present(), "tenant_allowed": guard.live_allowed(t.id), "allowed": guard.describe(), "project": bool(setting(db, "mittwald_project_id")), + "core_bundle": setting(db, "core_supports_bundle", "false") == "true"}, + "core": {"tag": effective_tag(db, t), "pinned": bool(t.core_pin), "admin_core": contract.sha()[:10], "contract": contract.contract_version()}, + } + + +# ── Ausführung ────────────────────────────────────────────────────────────── + +def _append(dep_id: int, line: str) -> None: + with session() as db: + db.get(Deployment, dep_id).log += f"{datetime.now(timezone.utc).strftime('%H:%M:%S')} {line}\n" + + +def _finish(dep_id: int, status: str) -> None: + with session() as db: + d = db.get(Deployment, dep_id) + d.status, d.finished_at = status, datetime.now(timezone.utc) + + +def _client(live: bool, log, http=None) -> Mittwald: + return Mittwald(os.getenv("MITTWALD_API_TOKEN", "").strip(), os.getenv("MITTWALD_API_BASE", "https://api.mittwald.de/v2"), live, log, http) + + +def _hex_tag(tag: str) -> bool: + return bool(tag) and all(c in "0123456789abcdef" for c in tag.lower()) and len(tag) >= 7 + + +def verify_health(host: str, expect_sha: str | None, expect_bundle: int | None, log, *, get=None, tries: int = 18, delay: float = 5.0, + sleep=time.sleep) -> None: + """Prüft nach dem Deploy, ob wirklich läuft, was wir ausgerollt haben (Vertrag: /health.core / .bundle). + Wirft DeployError, wenn der Container nach `tries` Versuchen nicht gesund ist oder die falsche Version meldet.""" + if get is None: + import httpx + + def get(url): + r = httpx.get(url, timeout=8, follow_redirects=True) + return r.status_code, (r.json() if r.headers.get("content-type", "").startswith("application/json") else {}) + last = "keine Antwort" + for i in range(tries): + try: + status, body = get(f"https://{host}/health") + problems = [] + if status != 200 or body.get("status") != "ok": + problems.append(f"HTTP {status}") + core = body.get("core") + if expect_sha and _hex_tag(expect_sha): + if core is None: + log("⚠ /health meldet keine Core-Version (Image vor dem Vertrag) – Version nicht prüfbar") + elif not contract.same_sha(core.get("version", ""), expect_sha): + problems.append(f"Core {str(core.get('version'))[:10]} statt {expect_sha[:10]}") + if expect_bundle is not None and body.get("bundle"): + b = body["bundle"] + if b.get("source") != "admin" or b.get("version") != expect_bundle or b.get("stale"): + problems.append(f"Bundle {b.get('source')} v{b.get('version')}{' (veraltet)' if b.get('stale') else ''} statt admin v{expect_bundle}" + + (f" – {b.get('error')}" if b.get("error") else "")) + if not problems: + log(f"Health-Check https://{host}/health ✔" + (f" · Core {core['version'][:10]}" if core else "") + + (f" · Bundle v{body['bundle']['version']}" if body.get("bundle", {}).get("source") == "admin" else "")) + return + last = "; ".join(problems) + except Exception as exc: # noqa: BLE001 + last = f"{type(exc).__name__}: {exc}" + if i < tries - 1: + sleep(delay) + raise DeployError(f"Health-Check fehlgeschlagen nach {tries} Versuchen: {last}") + + +def execute(dep_id: int, tenant_id: str, kind: str, http=None, oidc_client=None, core_tag: str | None = None, health=None) -> bool: + """Führt einen Deployment-Datensatz aus. kind: dry-run | deploy | offboard-dry | offboard. + core_tag überschreibt den Core-Tag (Rollout/Rollback); `health(host, expect_sha, expect_bundle, log)` ist in Tests ersetzbar.""" + log = lambda m: _append(dep_id, m) # noqa: E731 + dry = kind in ("dry-run", "offboard-dry") + live = live_enabled() and not dry + try: + with session() as db: + t = db.get(Tenant, tenant_id) + ver = t.current_version + project, stack = setting(db, "mittwald_project_id"), setting(db, "mittwald_stack_id") + host = host_for(db, t) if setting(db, "base_domain") else None + source, bundle_ok = t.source, setting(db, "core_supports_bundle", "false") == "true" + image, tag = image_ref(db, t, core_tag), effective_tag(db, t, core_tag) + pinned = bool(t.core_pin) and not core_tag + log(f"▶ {kind} „{tenant_id}“ · Version v{ver} · {image}{' (gepinnt)' if pinned else ''} · Modus: {'LIVE' if live else 'Dry-Run (keine Schreibzugriffe)'}") + if not contract.supported(): + raise DeployError(f"Core-Vertrag {contract.contract_version()} wird von dieser Admin-Version nicht unterstützt – Admin aktualisieren.") + if source == "admin" and not bundle_ok and not dry: + raise DeployError("Quelle „Admin“ ist noch gesperrt: Der Core kann das Bundle noch nicht laden (Einstellung core_supports_bundle).") + if not dry and not live_enabled(): + raise DeployError("Echte Deployments sind gesperrt (DEPLOY_LIVE != true).") + if not dry and not guard.live_allowed(tenant_id): + raise DeployError(guard.denial(tenant_id)) + if live and source == "admin": + with session() as db: + url = setting(db, "admin_public_url") + if not url.startswith("https://") or "<" in url: + raise DeployError("Einstellung „Öffentliche URL der Admin-Plattform“ (https://…) fehlt – der Container könnte sein Bundle nicht holen.") + + if not kind.startswith("offboard"): + # 1) OIDC-Client abgleichen (legt bei Bedarf an) – VOR dem Service, weil dessen Env die Client-Daten braucht + rep = onyva_login.sync_tenant(tenant_id, apply=live, log=log, client=oidc_client, actor="deploy") + if live and not rep["ok"]: + raise DeployError(f"OIDC-Abgleich fehlgeschlagen: {rep['error']}") + with session() as db: + t = db.get(Tenant, tenant_id) + if live: + lacking = missing_secrets(db, t) + if lacking: + raise DeployError("Pflicht-Secrets ohne Wert: " + ", ".join(lacking) + " (Tenant → Secrets bzw. Domain & Login, geteilte unter Einstellungen).") + definition = {"description": plan(db, t)["patch"]["description"], "image": image, "ports": [f"{PORT}:{PORT}/tcp"], + "volumes": [f"vol-{t.id}:/data"], "environment": build_env(db, t, reveal=live)} + mw = _client(live, log, http) + sid = mw.resolve_stack_id(project, stack) + if kind.startswith("offboard"): + mw.offboard_service(stack_id=sid, service=f"app-{tenant_id}", volume=f"vol-{tenant_id}", project_id=project, hostname=host) + log("Hinweis: Der OIDC-Client bleibt im Login bestehen (Tenant → Übersicht → Gefahrenbereich: „OIDC-Client im Login löschen“).") + else: + mw.deploy_service(stack_id=sid, service=f"app-{tenant_id}", volume=f"vol-{tenant_id}", definition=definition, + container_port=PORT, project_id=project, hostname=host) + if live and not kind.startswith("offboard") and host: + (health or verify_health)(host, tag, ver if source == "admin" else None, log) + if not dry: + with session() as db: + t = db.get(Tenant, tenant_id) + if kind == "deploy": + t.deployed_version, t.deployed_image, t.deployed_at = ver, tag, datetime.now(timezone.utc) + store.audit(db, "system", f"{kind}.live", tenant_id, f"v{ver} :{tag}") + log("✔ Fertig" if live else "Dry-Run beendet – es wurde nichts geschrieben.") + return True + except DeployError as exc: + log(f"✘ {exc}") + return False + except Exception as exc: # noqa: BLE001 + log(f"✘ Unerwarteter Fehler: {type(exc).__name__}: {exc}") + return False + + +def start(tenant_id: str, kind: str, actor: str, batch_id: str = "", http=None, wait: bool = False, oidc_client=None, + core_tag: str | None = None, health=None) -> int: + with session() as db: + t = db.get(Tenant, tenant_id) + d = Deployment(tenant_id=tenant_id, kind=kind, version=t.current_version, image_tag=effective_tag(db, t, core_tag), + actor=actor, batch_id=batch_id, simulated=not (live_enabled() and kind in ("deploy", "offboard"))) + db.add(d) + db.flush() + dep_id = d.id + + def work(): + ok = execute(dep_id, tenant_id, kind, http, oidc_client, core_tag, health) + _finish(dep_id, "success" if ok else "failed") + + th = threading.Thread(target=work, daemon=True) + th.start() + if wait: + th.join() + return dep_id + + +def run_sequence(tenant_ids: list[str], kind: str, actor: str, *, batch: str, core_tag: str | None = None, http=None, oidc_client=None, + health=None, canary: list[str] | None = None, wait: bool = False, on_done=None) -> list[int]: + """Tenants nacheinander (zuerst die Canary-Tenants), Abbruch beim ersten Fehler – der Rest wird „cancelled“. + on_done(ok, results) wird nach dem Lauf aufgerufen (z. B. um ein Release abzuschließen).""" + if kind in ("deploy", "offboard") and live_enabled(): # Live: nur freigegebene Tenants (siehe guard.py) + skipped = [t for t in tenant_ids if not guard.live_allowed(t)] + tenant_ids = [t for t in tenant_ids if guard.live_allowed(t)] + if skipped: + with session() as db: + store.audit(db, actor, "deploy.skipped_not_allowed", None, ", ".join(skipped)) + canary = [c for c in (canary or []) if c in tenant_ids] + order = canary + [t for t in tenant_ids if t not in canary] + with session() as db: + rows = [] + for tid in order: + t = db.get(Tenant, tid) + d = Deployment(tenant_id=tid, kind=kind, version=t.current_version, image_tag=effective_tag(db, t, core_tag), actor=actor, + batch_id=batch, status="queued", simulated=not (live_enabled() and kind == "deploy")) + db.add(d) + rows.append(d) + db.flush() + dep_ids = [d.id for d in rows] + + def seq(): + failed, results = False, {} + for tid, did in zip(order, dep_ids): + if failed: + _append(did, "übersprungen – vorheriger Tenant fehlgeschlagen (Rollout abgebrochen)") + _finish(did, "cancelled") + results[tid] = "cancelled" + continue + with session() as db: + db.get(Deployment, did).status = "running" + ok = execute(did, tid, kind, http, oidc_client, core_tag, health) + _finish(did, "success" if ok else "failed") + results[tid] = "success" if ok else "failed" + failed = not ok + if tid in canary and ok and tid == canary[-1]: + _append(did, "Canary erfolgreich – restliche Tenants folgen") + if on_done: + on_done(not failed, results) + + th = threading.Thread(target=seq, daemon=True) + th.start() + if wait: + th.join() + return dep_ids + + +def start_all(kind: str, actor: str, http=None, wait: bool = False, oidc_client=None, core_tag: str | None = None, health=None) -> tuple[str, list[int]]: + """Alle aktiven, nicht gepinnten Tenants nacheinander; beim ersten Fehler Abbruch.""" + batch = uuid.uuid4().hex[:10] + with session() as db: + ids = [t.id for t in db.scalars(select(Tenant).where(Tenant.status == "active").order_by(Tenant.id)) if not (core_tag and t.core_pin)] + return batch, run_sequence(ids, kind, actor, batch=batch, core_tag=core_tag, http=http, oidc_client=oidc_client, health=health, wait=wait) diff --git a/app/services/guard.py b/app/services/guard.py new file mode 100644 index 0000000..272f365 --- /dev/null +++ b/app/services/guard.py @@ -0,0 +1,35 @@ +"""Schreib-Freigabe für externe Systeme (Mittwald, Login-API) – pro Tenant. + +`DEPLOY_ALLOWED_TENANTS` (Env der Admin-Plattform) legt fest, welche Tenants live angefasst werden dürfen: + (leer/nicht gesetzt) keiner – auch mit DEPLOY_LIVE=true wird nichts geschrieben + demo-admin,demo2 nur diese + * alle +Greift bei Live-Deploy, Offboard, Rollout/Rollback und beim Schreiben im Login-System (OIDC-Abgleich/Löschen). +Dry-Runs und Lesezugriffe sind nie betroffen. Damit lässt sich die Plattform schrittweise und gefahrlos parallel zum Altbetrieb einführen. +""" +from __future__ import annotations + +import os + + +def allowed_tenants() -> set[str] | None: + """None = alle, sonst die erlaubten IDs (leere Menge = keiner).""" + raw = os.getenv("DEPLOY_ALLOWED_TENANTS", "").strip() + if raw == "*": + return None + return {x.strip() for x in raw.split(",") if x.strip()} + + +def live_allowed(tenant_id: str) -> bool: + a = allowed_tenants() + return a is None or tenant_id in a + + +def describe() -> str: + a = allowed_tenants() + return "alle Tenants" if a is None else (", ".join(sorted(a)) if a else "keiner") + + +def denial(tenant_id: str) -> str: + return (f"Tenant „{tenant_id}“ ist für Live-Schreibzugriffe nicht freigegeben (Env DEPLOY_ALLOWED_TENANTS = {describe()}). " + "Dry-Runs sind weiterhin möglich.") diff --git a/app/services/importer.py b/app/services/importer.py new file mode 100644 index 0000000..0e4a24b --- /dev/null +++ b/app/services/importer.py @@ -0,0 +1,151 @@ +"""Importiert die Tenants der bestehenden transkript-platform (Git-Ordner) in die Datenbank. + +Idempotent: ein Tenant, dessen Inhalt bereits identisch als aktuelle Version existiert, +wird übersprungen. Secrets werden standardmäßig NUR als Schlüsselnamen importiert +(Wert „extern/SOPS“); mit with_secrets=True werden sie via `sops -d` entschlüsselt +und verschlüsselt in der DB abgelegt. +""" +from __future__ import annotations + +import json +import subprocess +from pathlib import Path + +import yaml +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.models import Deployment, Secret, Setting, Tenant, Version +from app.services import crypto, store +from app.services.samples import DEFAULT_SAMPLE, ROTARY_SAMPLE + +IGNORE = {"secrets.enc.yaml", "tenant.json"} +IGNORE_DIRS = {"__pycache__"} + +# Bisherige Gitea-„Variables“ (docs/DEPLOYMENT.md) → geteilte Einstellungen +DEFAULT_SETTINGS = { + "base_domain": "onyscribe.de", + "mittwald_project_id": "", + "mittwald_stack_id": "", + "registry": "", + "image_name": "transkript-platform", + "oidc_issuer": "https://login.onyva.dev", + "onyva_login_api_base": "", + "auth_enabled": "true", + "app_cookie_secure": "true", + "max_file_size_mb": "300", + "cortecs_base_url": "https://api.cortecs.ai/v1", + "llm_model": "claude-4-6-sonnet", + "llm_max_tokens": "16000", + "llm_temperature": "0.2", + "smtp_host": "", + "smtp_port": "587", + "smtp_user": "", + "smtp_from": "Gesprächsprotokoll", + "mistral_transcribe_model": "voxtral-mini-latest", + "mistral_diarize": "true", + "mistral_timeout": "600", + "core_image_tag": "latest", + "core_supports_bundle": "false", + "canary_tenants": "demo", + "admin_public_url": "", + "cost_api_base": "", + "cost_tracking_enabled": "", + "agent_model": "claude-4-6-sonnet", + "agent_api": "messages", +} + + +def seed_settings(db: Session) -> None: + for k, v in DEFAULT_SETTINGS.items(): + if db.get(Setting, k) is None: + db.add(Setting(key=k, value=v)) + + +def _sops_keys(path: Path) -> list[str]: + if not path.exists(): + return [] + data = yaml.safe_load(path.read_text()) or {} + return [k for k in data if k != "sops"] + + +def _sops_decrypt(path: Path) -> dict[str, str]: + out = subprocess.run(["sops", "-d", "--output-type", "json", str(path)], capture_output=True, text=True, check=True) + return {k: str(v) for k, v in json.loads(out.stdout).items()} + + +def _upsert_secrets(db: Session, tenant_id: str | None, path: Path, with_secrets: bool) -> int: + keys = _sops_keys(path) + values = _sops_decrypt(path) if (with_secrets and keys) else {} + n = 0 + for key in keys: + row = db.scalar(select(Secret).where(Secret.tenant_id == tenant_id, Secret.key == key)) + if row is None: + row = Secret(tenant_id=tenant_id, key=key) + db.add(row) + if key in values and values[key]: + row.value_enc = crypto.encrypt(values[key]) + row.source = "manual" + elif row.value_enc is None: + row.source = "sops-import" + n += 1 + return n + + +def import_all(db: Session, root: Path, with_secrets: bool = False, force: bool = False) -> list[str]: + log: list[str] = [] + seed_settings(db) + tenants_dir = root / "tenants" + src_rev = "" + try: + src_rev = subprocess.run(["git", "-C", str(root), "rev-parse", "--short", "HEAD"], capture_output=True, text=True).stdout.strip() + except Exception: + pass + + n = _upsert_secrets(db, None, root / "secrets" / "shared.enc.yaml", with_secrets) + log.append(f"geteilte Secrets: {n} Schlüssel") + + for tdir in sorted(p for p in tenants_dir.iterdir() if p.is_dir()): + tid = tdir.name + cfg_file = tdir / "tenant.json" + if not cfg_file.exists(): + continue + raw = json.loads(cfg_file.read_text(encoding="utf-8")) + deploy = raw.pop("deploy", {}) or {} + files: dict[str, bytes] = {} + for p in sorted(tdir.rglob("*")): + if p.is_dir() or p.name in IGNORE or any(part in IGNORE_DIRS for part in p.relative_to(tdir).parts): + continue + files[p.relative_to(tdir).as_posix()] = p.read_bytes() + + t = db.get(Tenant, tid) + if t is None: + res = deploy.get("resources") or {} + t = Tenant( + id=tid, name=raw.get("name", tid), subdomain=deploy.get("subdomain", tid), + cpu=float(res.get("cpu", 0.5)), memory=str(res.get("memory", "512M")), + domain_status="verified", source="git", deployed_image="git-baked", + preview_sample=ROTARY_SAMPLE if tid.startswith("rotary") else None, + # Bestehende Clients wurden von Hand angelegt → nur „adoptieren“: fehlende Redirect-URI ergänzen, sonst nichts anfassen + oidc={"mode": "adopt"}, + ) + db.add(t) + db.flush() + shas = {p: store.put_blob(db, data, p) for p, data in files.items()} + cur = store.current_version(db, t) + same = cur is not None and cur.files == shas and json.dumps(cur.config, sort_keys=True) == json.dumps(raw, sort_keys=True) + if same and not force: + log.append(f"{tid}: unverändert (v{t.current_version})") + else: + number = (t.current_version or 0) + 1 + db.add(Version(tenant_id=tid, number=number, message=f"Import aus transkript-platform @{src_rev}", + author="import", config=raw, files=shas)) + t.current_version = number + if t.deployed_version is None: + t.deployed_version = number + store.audit(db, "import", "tenant.import", tid, f"v{number} aus {src_rev}") + log.append(f"{tid}: importiert als v{number} ({len(files)} Dateien)") + k = _upsert_secrets(db, tid, tdir / "secrets.enc.yaml", with_secrets) + log.append(f" Secrets: {k} Schlüssel") + db.flush() + return log diff --git a/app/services/llm.py b/app/services/llm.py new file mode 100644 index 0000000..cbb3ba0 --- /dev/null +++ b/app/services/llm.py @@ -0,0 +1,121 @@ +"""Zugang zu Cortecs (OpenAI-kompatibel + Anthropic-Messages) für Agent und Prompt-Test. + +Der Key kommt aus dem geteilten Secret CORTECS_API_KEY (verschlüsselt in der DB) oder der Env CORTECS_API_KEY. +""" +from __future__ import annotations + +import os + +import httpx +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.models import Secret, Setting +from app.services import crypto + +DEFAULT_BASE = "https://api.cortecs.ai/v1" + + +class LLMNotConfigured(RuntimeError): + pass + + +def _setting(db: Session, key: str, default: str = "") -> str: + s = db.get(Setting, key) + return s.value if s and s.value else default + + +def key_info(db: Session, tenant_id: str | None = None) -> tuple[str, str, str | None]: + """(key, quelle, fehler). Reihenfolge: geteiltes Secret (DB) → Env CORTECS_API_KEY → Key des Tenants (Rückfall). + Quelle: 'shared' | 'env' | 'tenant' | 'none'. fehler: z. B. nicht entschlüsselbar (SECRET_KEY geändert?).""" + error = None + rows = [("shared", db.scalar(select(Secret).where(Secret.tenant_id.is_(None), Secret.key == "CORTECS_API_KEY")))] + for source, row in rows: + if row and row.value_enc: + try: + return crypto.decrypt(row.value_enc), source, None + except Exception: # noqa: BLE001 – falscher SECRET_KEY o. Ä. + error = "Geteilter CORTECS_API_KEY in der DB ist nicht entschlüsselbar (SECRET_KEY geändert?) – bitte neu setzen." + env = os.getenv("CORTECS_API_KEY", "").strip() + if env: + return env, "env", error + if tenant_id: + row = db.scalar(select(Secret).where(Secret.tenant_id == tenant_id, Secret.key == "CORTECS_API_KEY")) + if row and row.value_enc: + try: + return crypto.decrypt(row.value_enc), "tenant", error + except Exception: # noqa: BLE001 + error = error or "CORTECS_API_KEY dieses Tenants ist nicht entschlüsselbar." + return "", "none", error + + +def api_key(db: Session, tenant_id: str | None = None) -> str: + return key_info(db, tenant_id)[0] + + +def base_url(db: Session) -> str: + return _setting(db, "cortecs_base_url", DEFAULT_BASE).rstrip("/") + + +def configured(db: Session, tenant_id: str | None = None) -> bool: + return bool(api_key(db, tenant_id)) + + +def require_key(db: Session, tenant_id: str | None = None) -> str: + k, _, err = key_info(db, tenant_id) + if not k: + raise LLMNotConfigured(err or "CORTECS_API_KEY fehlt – unter Einstellungen → Geteilte Secrets setzen (oder Env CORTECS_API_KEY).") + return k + + +def list_models(db: Session) -> list[dict]: + """GET /v1/models – Rohdaten von Cortecs, auf die für die Auswahl nötigen Felder reduziert.""" + key = require_key(db) + r = httpx.get(f"{base_url(db)}/models", headers={"Authorization": f"Bearer {key}"}, timeout=30) + r.raise_for_status() + data = r.json() + items = data.get("data") if isinstance(data, dict) else data + out = [] + for m in items or []: + if isinstance(m, str): + m = {"id": m} + caps = {k: v for k, v in m.items() if isinstance(v, (bool, list, dict)) or k in ("context_size", "context_length")} + out.append({"id": m.get("id") or m.get("name"), "raw": caps, + "tools": _supports_tools(m)}) + return sorted((o for o in out if o["id"]), key=lambda o: o["id"]) + + +def _supports_tools(m: dict) -> bool | None: + """Cortecs dokumentiert die Feldnamen nicht eindeutig → mehrere plausible Varianten prüfen; None = unbekannt.""" + flat = {} + def walk(prefix, v): + if isinstance(v, dict): + for k, x in v.items(): + walk(f"{prefix}.{k}".lower(), x) + elif isinstance(v, list): + flat[prefix] = [str(i).lower() for i in v] + else: + flat[prefix] = v + walk("", m) + for k, v in flat.items(): + if "tool" in k or "function" in k: + return bool(v) + if isinstance(v, list) and any("tool" in i or "function" in i for i in v): + return True + return None + + +def summarize(db: Session, system_prompt: str, user_content: str, model: str | None = None, tenant_id: str | None = None) -> dict: + """Ein Protokoll-Lauf wie im Core (Chat Completions), für den Prompt-Test.""" + from openai import OpenAI + client = OpenAI(api_key=require_key(db, tenant_id), base_url=base_url(db), max_retries=2, timeout=300) + model = model or _setting(db, "llm_model", "claude-4-6-sonnet") + resp = client.chat.completions.create( + model=model, temperature=float(_setting(db, "llm_temperature", "0.2")), + max_tokens=int(_setting(db, "llm_max_tokens", "16000")), stream=False, + messages=[{"role": "system", "content": system_prompt}, {"role": "user", "content": user_content}], + ) + text = "\n".join(c.message.content for c in resp.choices if c.message and c.message.content).strip() + u = getattr(resp, "usage", None) + return {"text": text, "model": model, "input_tokens": getattr(u, "prompt_tokens", 0), "output_tokens": getattr(u, "completion_tokens", 0), + "truncated": any(getattr(c, "finish_reason", "") in ("length", "max_tokens") for c in resp.choices)} diff --git a/app/services/mittwald.py b/app/services/mittwald.py new file mode 100644 index 0000000..e92af31 --- /dev/null +++ b/app/services/mittwald.py @@ -0,0 +1,159 @@ +"""Mittwald-API-Client (Port der Logik aus transkript-platform/infra/deploy.py). + +Sicherheitsnetze wie dort: differenzielles PATCH (nie PUT), Namensraum `app-`, Post-Write-Guard. +Zusätzlich: `live=False` (Standard) blockiert JEDEN schreibenden Aufruf – es wird nur geloggt, was passieren würde. +Lesende Aufrufe laufen nur, wenn ein Token gesetzt ist. +""" +from __future__ import annotations + +import json +from typing import Callable + +import httpx + + +class DeployError(RuntimeError): + pass + + +class DryRunSkip(Exception): + pass + + +def mask_env(env: dict) -> dict: + import re + return {k: ("••••" if re.search(r"(SECRET|PASSWORD|KEY|TOKEN)$", k) else v) for k, v in env.items()} + + +class Mittwald: + def __init__(self, token: str, base: str, live: bool, log: Callable[[str], None], http: Callable | None = None): + self.token, self.base, self.live, self.log = token, base.rstrip("/"), live, log + self._http = http or self._real_http + self._project_uuid: str | None = None + + @staticmethod + def _real_http(method, url, headers, body): + r = httpx.request(method, url, headers=headers, json=body, timeout=60) + try: + data = r.json() if r.content else None + except ValueError: + data = None + return r.status_code, data, r.text[:500] + + def api(self, method: str, path: str, body: dict | None = None, *, write: bool, fatal: bool = True): + if write and not self.live: + self.log(f"[DRY-RUN] {method} {path}") + if body is not None: + shown = json.loads(json.dumps(body)) + for svc in (shown.get("services") or {}).values(): + if isinstance(svc, dict) and "environment" in svc: + svc["environment"] = mask_env(svc["environment"]) + self.log(" body: " + json.dumps(shown, ensure_ascii=False)[:1500]) + raise DryRunSkip() + if not self.token: + if not self.live: + self.log(f"(übersprungen: lesender Aufruf {method} {path} – kein MITTWALD_API_TOKEN)") + raise DryRunSkip() + raise DeployError("MITTWALD_API_TOKEN nicht gesetzt.") + status, data, text = self._http(method, f"{self.base}{path}", {"Authorization": f"Bearer {self.token}", "Content-Type": "application/json"}, body) + if status >= 400: + msg = f"{method} {path} → HTTP {status}: {text}" + if fatal: + raise DeployError(msg) + self.log(f"WARNUNG (nicht fatal): {msg}") + return None + return data + + def try_api(self, *a, **kw): + try: + return self.api(*a, **kw) + except DryRunSkip: + return None + + # ── Stack ── + def resolve_stack_id(self, project_id: str, stack_id: str) -> str: + if stack_id: + return stack_id + if not project_id: + if not self.live: + self.log("(Hinweis: Mittwald PROJECT_ID/STACK_ID sind noch nicht in den Einstellungen gesetzt – Platzhalter im Dry-Run)") + return "" + raise DeployError("Mittwald PROJECT_ID (oder STACK_ID) fehlt in den Einstellungen.") + try: + stacks = self.api("GET", f"/projects/{project_id}/stacks/", write=False) + except DryRunSkip: + return "" + items = stacks if isinstance(stacks, list) else (stacks or {}).get("items", []) + for s in items: + if str(s.get("description") or s.get("name") or "").lower() == "default": + return s["id"] + if items: + return items[0]["id"] + raise DeployError("Kein Stack im Projekt gefunden.") + + def get_stack(self, stack_id: str) -> dict | None: + return self.try_api("GET", f"/stacks/{stack_id}/", write=False) + + @staticmethod + def services_of(stack: dict | None) -> dict[str, dict]: + if not stack: + return {} + svcs = stack.get("services") + if isinstance(svcs, dict): + return svcs + if isinstance(svcs, list): + return {(s.get("serviceName") or s.get("name") or s.get("id")): s for s in svcs if (s.get("serviceName") or s.get("name") or s.get("id"))} + return {} + + def project_uuid(self, project_id: str) -> str: + if self._project_uuid: + return self._project_uuid + proj = self.try_api("GET", f"/projects/{project_id}/", write=False, fatal=False) + self._project_uuid = (proj or {}).get("id") or project_id + return self._project_uuid + + # ── Operationen ── + def deploy_service(self, *, stack_id: str, service: str, volume: str, definition: dict, container_port: str, + project_id: str, hostname: str | None) -> None: + stack = self.get_stack(stack_id) + existing = set(self.services_of(stack)) + protected = existing - {service} + if protected: + self.log(f"geschützte bestehende Services (bleiben unangetastet): {sorted(protected)}") + self.try_api("PATCH", f"/stacks/{stack_id}/", {"volumes": {volume: {"name": volume}}}, write=True) + self.try_api("PATCH", f"/stacks/{stack_id}/", {"services": {service: definition}}, write=True) + svc_id = "" + if self.live: + after = self.services_of(self.get_stack(stack_id)) + missing = protected - set(after) + if missing: + raise DeployError(f"ABBRUCH: bestehende Services verschwunden nach PATCH: {sorted(missing)}") + svc_id = after.get(service, {}).get("id", service) + self.try_api("POST", f"/stacks/{stack_id}/services/{svc_id}/actions/recreate/", write=True) + self.log("Post-Write-Guard: alle vorherigen Services noch vorhanden ✔") + if hostname: + self.ensure_ingress(project_id, hostname, svc_id, container_port) + + def ensure_ingress(self, project_id: str, hostname: str, container_id: str, port: str) -> None: + listing = self.try_api("GET", f"/projects/{project_id}/ingresses/", write=False, fatal=False) + items = listing if isinstance(listing, list) else (listing or {}).get("items", []) + if any(i.get("hostname") == hostname for i in items): + self.log(f"Ingress {hostname} existiert bereits → ok") + return + body = {"hostname": hostname, "projectId": self.project_uuid(project_id), + "paths": [{"path": "/", "target": {"container": {"id": container_id, "portProtocol": f"{port}/tcp"}}}]} + res = self.try_api("POST", "/ingresses", body, write=True, fatal=False) + if self.live: + self.log(f"Ingress {hostname} angelegt (Auto-TLS)" if res is not None else + f"⚠ Ingress {hostname} NICHT angelegt – Token braucht Domain/Ingress-Recht (Service läuft trotzdem).") + + def offboard_service(self, *, stack_id: str, service: str, volume: str, project_id: str, hostname: str | None) -> None: + self.try_api("PATCH", f"/stacks/{stack_id}/", {"services": {service: {}}}, write=True) + self.try_api("PATCH", f"/stacks/{stack_id}/", {"volumes": {volume: {}}}, write=True) + if hostname: + listing = self.try_api("GET", f"/projects/{project_id}/ingresses/", write=False, fatal=False) + items = listing if isinstance(listing, list) else (listing or {}).get("items", []) + for i in items: + if i.get("hostname") == hostname: + self.try_api("DELETE", f"/ingresses/{i['id']}", write=True, fatal=False) + self.log(f"Ingress {hostname} entfernt") diff --git a/app/services/onyva_login.py b/app/services/onyva_login.py new file mode 100644 index 0000000..d1c8123 --- /dev/null +++ b/app/services/onyva_login.py @@ -0,0 +1,312 @@ +"""Abgleich der OIDC-Clients mit der Developer-API von login.onyva.dev (`/api/v1`, siehe LoginSeite/docs/developer-api.md). + +Pro Tenant gibt es einen Soll-Zustand (`tenant.oidc`). Bei jedem Deploy wird der Ist-Zustand gelesen und bei Bedarf angelegt/angepasst: + + mode = off nichts anfassen + mode = adopt (Standard für importierte Altclients) nur sicherstellen, dass die Redirect-URIs des Tenants enthalten sind + mode = managed Redirect-URIs, auth_mode, totp_mode, allow_registration, backchannel_logout_uri exakt wie konfiguriert + +Freigaben (Memberships): `members` werden angelegt/aktualisiert; mit members_mode = exact werden zusätzliche Freigaben entfernt. + +Sicherheit: Lesen (GET) läuft immer, wenn ein Key da ist. SCHREIBEN nur mit apply=True – und apply erlaubt die Plattform nur, +wenn OIDC_SYNC_LIVE=true oder DEPLOY_LIVE=true. Das `client_secret` ist nur bei Anlage/Rotation sichtbar und wird SOFORT verschlüsselt gespeichert. +""" +from __future__ import annotations + +import os +import re +import time +from datetime import datetime, timezone +from typing import Callable + +import httpx +from sqlalchemy import select + +from app.db import session +from app.models import Secret, Setting, Tenant +from app.services import crypto, guard, store + +MODES = ("off", "adopt", "managed") +AUTH_MODES = ("required", "optional", "disabled") +TOTP_MODES = ("disabled", "optional", "required") +ROLES = ("viewer", "editor", "admin") +DEFAULTS = {"mode": "adopt", "auth_mode": "required", "totp_mode": "disabled", "allow_registration": False, + "backchannel_logout_uri": None, "members": [], "members_mode": "add", "last_sync": None} + + +class OnyvaError(RuntimeError): + pass + + +def key_present() -> bool: + return bool(os.getenv("ONYVA_LOGIN_API_KEY", "").strip()) + + +def writes_allowed() -> bool: + return os.getenv("OIDC_SYNC_LIVE", "false").lower() == "true" or os.getenv("DEPLOY_LIVE", "false").lower() == "true" + + +def base_url(db) -> str: + s = db.get(Setting, "onyva_login_api_base") + if s and s.value: + return s.value.rstrip("/") + issuer = db.get(Setting, "oidc_issuer") + return f"{(issuer.value if issuer and issuer.value else 'https://login.onyva.dev').rstrip('/')}/api/v1" + + +class OnyvaLogin: + """Dünner Client für /api/v1/apps. `http(method, url, headers, body) -> (status, data, headers)` ist in Tests ersetzbar.""" + + def __init__(self, base: str, key: str, http: Callable | None = None, sleep: Callable[[float], None] = time.sleep): + self.base, self.key, self._http, self._sleep = base.rstrip("/"), key, http or self._real, sleep + + @staticmethod + def _real(method, url, headers, body): + r = httpx.request(method, url, headers=headers, json=body, timeout=30) + try: + data = r.json() if r.content else None + except ValueError: + data = None + return r.status_code, data, dict(r.headers) + + def _req(self, method: str, path: str, body: dict | None = None): + for attempt in range(4): + status, data, headers = self._http(method, f"{self.base}{path}", {"Authorization": f"Bearer {self.key}", "Content-Type": "application/json"}, body) + if status == 429 and attempt < 3: # Rate-Limit: 120 Requests / 60 s pro Key + self._sleep(min(int({k.lower(): v for k, v in headers.items()}.get("retry-after", 5)), 60)) + continue + if status == 401: + raise OnyvaError("API-Key ungültig, widerrufen oder abgelaufen (401).") + return status, data + raise OnyvaError("Rate-Limit des Login-Systems (429) dauerhaft überschritten.") + + def _ok(self, method, path, body=None, ok=(200, 201, 204)): + status, data = self._req(method, path, body) + if status not in ok: + detail = data.get("detail") if isinstance(data, dict) else data + raise OnyvaError(f"{method} {path} → HTTP {status}: {str(detail)[:300]}") + return data + + def list_apps(self) -> list[dict]: + return (self._ok("GET", "/apps") or {}).get("apps", []) + + def get_app(self, cid: str) -> dict | None: + status, data = self._req("GET", f"/apps/{cid}") + if status == 404: + return None + if status != 200: + raise OnyvaError(f"GET /apps/{cid} → HTTP {status}") + return data + + def create_app(self, body: dict) -> dict: + return self._ok("POST", "/apps", body, ok=(201, 200)) + + def patch_app(self, cid: str, body: dict) -> dict: + return self._ok("PATCH", f"/apps/{cid}", body) + + def delete_app(self, cid: str) -> None: + self._ok("DELETE", f"/apps/{cid}", ok=(204, 200)) + + def rotate_secret(self, cid: str) -> dict: + return self._ok("POST", f"/apps/{cid}/rotate-secret") + + def memberships(self, cid: str) -> list[dict]: + return (self._ok("GET", f"/apps/{cid}/memberships") or {}).get("memberships", []) + + def put_membership(self, cid: str, email: str, role: str) -> bool: + status, _ = self._req("PUT", f"/apps/{cid}/memberships", {"user_email": email, "role": role}) + if status == 404: + return False # Nutzer existiert im Login nicht + if status not in (200, 201): + raise OnyvaError(f"PUT memberships → HTTP {status}") + return True + + def delete_membership(self, cid: str, email: str) -> None: + self._req("DELETE", f"/apps/{cid}/memberships/{email}") + + +def client_from_env(db, http=None) -> OnyvaLogin | None: + key = os.getenv("ONYVA_LOGIN_API_KEY", "").strip() + return OnyvaLogin(base_url(db), key, http) if key else None + + +# ── Soll-Zustand ──────────────────────────────────────────────────────────── + +def config_of(t: Tenant) -> dict: + return {**DEFAULTS, **(t.oidc or {})} + + +def validate_config(cfg: dict) -> dict: + out = {**DEFAULTS, **cfg} + if out["mode"] not in MODES: + raise ValueError("mode: off | adopt | managed") + if out["auth_mode"] not in AUTH_MODES: + raise ValueError("auth_mode: required | optional | disabled") + if out["totp_mode"] not in TOTP_MODES: + raise ValueError("totp_mode: disabled | optional | required") + if out["members_mode"] not in ("add", "exact"): + raise ValueError("members_mode: add | exact") + out["allow_registration"] = bool(out["allow_registration"]) + out["backchannel_logout_uri"] = (out["backchannel_logout_uri"] or "").strip() or None + if out["backchannel_logout_uri"] and not out["backchannel_logout_uri"].startswith("https://"): + raise ValueError("Backchannel-Logout-URI muss https:// sein und öffentlich erreichbar") + members, seen = [], set() + for m in out["members"] or []: + email, role = str(m.get("email", "")).strip().lower(), m.get("role", "viewer") + if not re.fullmatch(r"[^@\s]+@[^@\s]+\.[^@\s]+", email): + raise ValueError(f"Ungültige E-Mail: {email!r}") + if role not in ROLES: + raise ValueError(f"Rolle von {email}: viewer | editor | admin") + if email not in seen: + seen.add(email) + members.append({"email": email, "role": role}) + out["members"] = members + out.pop("last_sync", None) + return out + + +def desired_redirects(base_domain: str, t: Tenant) -> list[str]: + hosts = [f"{t.subdomain or t.id}.{base_domain}"] + if t.custom_domain: + hosts.append(t.custom_domain) + return [f"https://{h}/auth/callback" for h in hosts] + + +def diff_app(actual: dict, want: dict, mode: str) -> dict: + """Welche PATCH-Felder wären nötig? adopt: nur fehlende URIs ergänzen; managed: alles exakt.""" + changes: dict = {} + have, need = list(actual.get("redirect_uris") or []), want["redirect_uris"] + if mode == "adopt": + missing = [u for u in need if u not in have] + if missing: + changes["redirect_uris"] = have + missing + elif mode == "managed": + if set(have) != set(need): + changes["redirect_uris"] = need + for f in ("auth_mode", "totp_mode", "allow_registration", "backchannel_logout_uri"): + if actual.get(f) != want[f]: + changes[f] = want[f] + return changes + + +def _secret(db, tenant_id: str, key: str) -> str | None: + row = db.scalar(select(Secret).where(Secret.tenant_id == tenant_id, Secret.key == key)) + return crypto.decrypt(row.value_enc) if row and row.value_enc else None + + +def _store_credentials(tenant_id: str, client_id: str | None, client_secret: str | None, actor="onyva-login-sync") -> None: + """Sofort und in eigener Transaktion sichern – das Secret ist danach nicht mehr abrufbar.""" + from app.services import tenants as tsvc + with session() as db: + if client_id: + tsvc.set_secret(db, tenant_id, "OIDC_CLIENT_ID", client_id, actor) + if client_secret: + tsvc.set_secret(db, tenant_id, "OIDC_CLIENT_SECRET", client_secret, actor) + + +# ── Abgleich ──────────────────────────────────────────────────────────────── + +def sync_tenant(tenant_id: str, *, apply: bool, log: Callable[[str], None] = lambda m: None, client: OnyvaLogin | None = None, + rotate: bool = False, actor: str = "system") -> dict: + """Gleicht den OIDC-Client des Tenants ab. apply=False → nur lesen und Plan melden. + Rückgabe: {ok, applied, skipped, client_id, actions:[{kind,detail}], warnings:[...], created, error}.""" + rep = {"ok": True, "applied": False, "skipped": None, "client_id": None, "actions": [], "warnings": [], "created": False, "error": None} + act = lambda kind, detail: (rep["actions"].append({"kind": kind, "detail": detail}), log(f"OIDC: {detail}")) # noqa: E731 + warn = lambda msg: (rep["warnings"].append(msg), log(f"OIDC ⚠ {msg}")) # noqa: E731 + + if apply and not writes_allowed(): + rep.update(ok=False, error="Schreibzugriffe auf das Login-System sind gesperrt (OIDC_SYNC_LIVE/DEPLOY_LIVE nicht aktiv).") + return rep + if apply and not guard.live_allowed(tenant_id): + rep.update(ok=False, error=guard.denial(tenant_id)) + return rep + try: + with session() as db: + t = db.get(Tenant, tenant_id) + cfg = config_of(t) + base_domain = (db.get(Setting, "base_domain").value if db.get(Setting, "base_domain") else "example.de") + want = {"name": f"Onyscribe – {t.name}", "redirect_uris": desired_redirects(base_domain, t), "auth_mode": cfg["auth_mode"], + "totp_mode": cfg["totp_mode"], "allow_registration": cfg["allow_registration"], "backchannel_logout_uri": cfg["backchannel_logout_uri"]} + cid, has_secret = _secret(db, tenant_id, "OIDC_CLIENT_ID"), bool(_secret(db, tenant_id, "OIDC_CLIENT_SECRET")) + client = client or client_from_env(db) + mode = cfg["mode"] + if mode == "off": + rep["skipped"] = "OIDC-Verwaltung ist für diesen Tenant aus." + log("OIDC: Verwaltung aus – nichts zu tun") + return rep + if client is None: + rep["skipped"] = "ONYVA_LOGIN_API_KEY nicht gesetzt." + rep["ok"] = not apply # beim echten Deploy ist ein fehlender Key ein Fehler, im Dry-Run nur ein Hinweis + rep["error"] = None if rep["ok"] else rep["skipped"] + log("OIDC: (übersprungen – ONYVA_LOGIN_API_KEY nicht gesetzt)") + return rep + + app = client.get_app(cid) if cid else None + new_app = app is None + verb = "" if apply else "würde " + if app is None: + if cid: + warn(f"Client {cid} existiert im Login nicht mehr – es wird ein neuer angelegt.") + body = {k: want[k] for k in ("name", "redirect_uris", "auth_mode", "totp_mode", "allow_registration", "backchannel_logout_uri")} + act("create", f"{verb}App „{want['name']}“ anlegen (Redirect: {', '.join(want['redirect_uris'])}; auth_mode={want['auth_mode']})") + if apply: + created = client.create_app(body) + cid = created["client_id"] + _store_credentials(tenant_id, cid, created.get("client_secret"), actor) # ZUERST sichern + rep["created"], has_secret = True, True + log(f"OIDC: App angelegt → {cid} (Secret verschlüsselt gespeichert)") + app = {"redirect_uris": want["redirect_uris"], "auth_mode": want["auth_mode"]} + else: + changes = diff_app(app, want, mode) + if changes: + act("patch", f"{verb}App {cid} anpassen: " + ", ".join(f"{k}={v}" for k, v in changes.items())) + if apply: + client.patch_app(cid, changes) + else: + log(f"OIDC: App {cid} ist abgeglichen") + rep["client_id"] = cid + + if not has_secret: + warn("Client-Secret ist nicht in der Admin-DB (beim Login nicht abrufbar) – eintragen oder „Secret rotieren“.") + if rotate and cid: + act("rotate", f"{verb}Secret von {cid} rotieren (altes sofort ungültig)") + if apply: + _store_credentials(tenant_id, None, client.rotate_secret(cid)["client_secret"], actor) + + # Freigaben + members = cfg["members"] + effective_auth = want["auth_mode"] if mode == "managed" else (app.get("auth_mode") or want["auth_mode"]) + if (members or cfg["members_mode"] == "exact") and (cid or new_app): + current = {} if new_app else {m["email"].lower(): m["role"] for m in client.memberships(cid)} + for m in members: + if current.get(m["email"]) != m["role"]: + act("member_put", f"{verb}{m['email']} als {m['role']} freigeben") + if apply and not client.put_membership(cid, m["email"], m["role"]): + warn(f"{m['email']} existiert im Login nicht – Nutzer dort anlegen, dann erneut abgleichen.") + if cfg["members_mode"] == "exact": + for email in sorted(set(current) - {m["email"] for m in members}): + act("member_delete", f"{verb}Freigabe von {email} entziehen") + if apply: + client.delete_membership(cid, email) + elif effective_auth == "required" and not members: + log("OIDC: auth_mode=required ohne gepflegte Freigaben – bestehende Freigaben bleiben unverändert") + rep["applied"] = apply and bool(rep["actions"]) + except OnyvaError as exc: + rep.update(ok=False, error=str(exc)) + log(f"OIDC ✘ {exc}") + except Exception as exc: # noqa: BLE001 + rep.update(ok=False, error=f"{type(exc).__name__}: {exc}") + log(f"OIDC ✘ {rep['error']}") + if apply: + _record(tenant_id, rep) + return rep + + +def _record(tenant_id: str, rep: dict) -> None: + with session() as db: + t = db.get(Tenant, tenant_id) + cfg = dict(t.oidc or {}) + cfg["last_sync"] = {"ts": datetime.now(timezone.utc).isoformat(), "ok": rep["ok"], "created": rep["created"], "error": rep["error"], + "actions": [a["detail"] for a in rep["actions"]], "warnings": rep["warnings"]} + t.oidc = cfg + store.audit(db, "system", "oidc.sync", tenant_id, "ok" if rep["ok"] else f"Fehler: {rep['error']}") diff --git a/app/services/preflight.py b/app/services/preflight.py new file mode 100644 index 0000000..99ad281 --- /dev/null +++ b/app/services/preflight.py @@ -0,0 +1,114 @@ +"""Vorflug-Check: ist ein Tenant bereit für einen Live-Deploy? Liest nur (Mittwald-GET, Login-API-GET, eigener Health) und schreibt nichts. + +Jeder Punkt: {id, level: ok|warn|fail|info, label, detail, fix}. Ein Deploy ist „bereit“, wenn es kein `fail` gibt. +""" +from __future__ import annotations + +import socket + +from sqlalchemy import select + +from app.db import session +from app.models import Secret, Tenant +from app.services import contract, deploy, guard, onyva_login, preview, store +from app.services.mittwald import DeployError, DryRunSkip, Mittwald + + +def _item(id_, level, label, detail="", fix=""): + return {"id": id_, "level": level, "label": label, "detail": detail, "fix": fix} + + +def run(tenant_id: str, *, mw_http=None, oidc_client=None, self_get=None) -> dict: + out: list[dict] = [] + add = lambda *a, **k: out.append(_item(*a, **k)) # noqa: E731 + with session() as db: + t = db.get(Tenant, tenant_id) + cfg, _ = store.content(db, t, "current") + draft, source, pin = bool(t.draft), t.source, t.core_pin + base_domain, project, stack = deploy.setting(db, "base_domain"), deploy.setting(db, "mittwald_project_id"), deploy.setting(db, "mittwald_stack_id") + registry, admin_url = deploy.setting(db, "registry"), deploy.setting(db, "admin_public_url") + bundle_ok = deploy.setting(db, "core_supports_bundle", "false") == "true" + tag = deploy.effective_tag(db, t) + host = deploy.host_for(db, t) + missing = deploy.missing_secrets(db, t) + oc = onyva_login.config_of(t) + has_oidc_secrets = all(db.scalar(select(Secret).where(Secret.tenant_id == tenant_id, Secret.key == k, Secret.value_enc.is_not(None))) is not None + for k in ("OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET")) + stt_provider = (cfg.get("stt") or {}).get("provider") or "mistral" + + # Freigaben / Modus + add("live", "ok" if deploy.live_enabled() else "warn", "DEPLOY_LIVE", "aktiv" if deploy.live_enabled() else "nicht aktiv – nur Dry-Run möglich", + "" if deploy.live_enabled() else "Env DEPLOY_LIVE=true der Admin-Plattform setzen und neu starten (erst nach erfolgreichem Dry-Run).") + add("allow", "ok" if guard.live_allowed(tenant_id) else "warn", "Live-Freigabe für diesen Tenant", f"DEPLOY_ALLOWED_TENANTS = {guard.describe()}", + "" if guard.live_allowed(tenant_id) else f"Env DEPLOY_ALLOWED_TENANTS um „{tenant_id}“ ergänzen.") + # Vertrag / Core + add("contract", "ok" if contract.supported() else "fail", "Core-Vertrag", f"Admin-Core {contract.sha()[:10]}, Vertrag v{contract.contract_version()}", + "" if contract.supported() else "Admin-Plattform aktualisieren.") + hex_tag = deploy._hex_tag(tag) + add("tag", "ok" if hex_tag else "warn", "Core-Image-Tag", f":{tag}" + (" (gepinnt)" if pin else ""), + "" if hex_tag else "Besser den vollen Git-SHA als Pin setzen (Tenant → Übersicht → Core-Version) – dann prüft der Health-Check die Core-Version.") + if source == "admin": + add("bundle", "ok" if bundle_ok else "fail", "Core kann Bundle laden", "Einstellung core_supports_bundle", "" if bundle_ok else "Einstellungen → „Core kann Bundle laden“ aktivieren (erst wenn das Image den Bundle-Loader enthält).") + good_url = admin_url.startswith("https://") and "<" not in admin_url + add("adminurl", "ok" if good_url else "fail", "Öffentliche Admin-URL", admin_url or "nicht gesetzt", + "" if good_url else "Einstellungen → „Öffentliche URL der Admin-Plattform“ (https://…): so holt der Tenant-Container sein Bundle.") + if good_url: + try: + status = (self_get or _get)(f"{admin_url.rstrip('/')}/healthz") + add("adminreach", "ok" if status == 200 else "fail", "Admin von außen erreichbar", f"GET /healthz → {status}", "" if status == 200 else "Domain/Proxy in Coolify prüfen.") + except Exception as exc: # noqa: BLE001 + add("adminreach", "fail", "Admin von außen erreichbar", f"{type(exc).__name__}: {str(exc)[:120]}", "Domain/Proxy in Coolify prüfen.") + # Mittwald + add("domain", "ok" if base_domain else "fail", "Basis-Domain", base_domain or "nicht gesetzt", "" if base_domain else "Einstellungen → Basis-Domain (= Gitea-Variable DOMAIN).") + add("registry", "ok" if registry else "fail", "Registry", registry or "nicht gesetzt", "" if registry else "Einstellungen → Registry (= Gitea-Variable REGISTRY).") + add("mtoken", "ok" if deploy.token_present() else "fail", "MITTWALD_API_TOKEN", "gesetzt" if deploy.token_present() else "nicht gesetzt", + "" if deploy.token_present() else "Env MITTWALD_API_TOKEN der Admin-Plattform setzen (derselbe Token wie in Gitea).") + add("mproject", "ok" if (project or stack) else "fail", "Mittwald PROJECT_ID / STACK_ID", f"{project or '–'} / {stack or '–'}", "" if (project or stack) else "Einstellungen → PROJECT_ID (und optional STACK_ID).") + if deploy.token_present() and (project or stack): + try: + mw = Mittwald(__import__("os").getenv("MITTWALD_API_TOKEN", ""), __import__("os").getenv("MITTWALD_API_BASE", "https://api.mittwald.de/v2"), False, lambda m: None, mw_http) + sid = mw.resolve_stack_id(project, stack) + services = sorted(Mittwald.services_of(mw.api("GET", f"/stacks/{sid}/", write=False))) + mine = f"app-{tenant_id}" + protected = [s for s in services if s != mine] + add("stack", "ok", "Mittwald-Stack lesbar", f"{len(services)} Services; bestehende bleiben unangetastet: {', '.join(protected) or '–'}") + add("svc", "info", "Service dieses Tenants", f"{mine} " + ("existiert bereits (wird aktualisiert)" if mine in services else "existiert noch nicht (wird angelegt)")) + except (DeployError, DryRunSkip) as exc: + add("stack", "fail", "Mittwald-Stack lesbar", str(exc)[:200], "Token-Rechte, PROJECT_ID/STACK_ID prüfen.") + except Exception as exc: # noqa: BLE001 + add("stack", "fail", "Mittwald-Stack lesbar", f"{type(exc).__name__}: {str(exc)[:160]}", "Netzwerk/Token prüfen.") + # Secrets / OIDC / STT + will_create = oc["mode"] == "managed" and onyva_login.key_present() and not has_oidc_secrets + real_missing = [m for m in missing if not (will_create and m in ("OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET"))] + add("secrets", "ok" if not real_missing else "fail", "Pflicht-Secrets", "vollständig" if not real_missing else "fehlen: " + ", ".join(real_missing), + "" if not real_missing else "Tenant → Secrets (tenantspezifisch) bzw. Einstellungen → Geteilte Secrets (z. B. CORTECS_API_KEY).") + if will_create: + add("oidcnew", "info", "OIDC-Client", "wird beim Deploy automatisch im Login angelegt (Client-ID/-Secret sofort gespeichert)") + elif oc["mode"] != "off" and not onyva_login.key_present(): + add("oidckey", "fail", "ONYVA_LOGIN_API_KEY", "nicht gesetzt – OIDC-Abgleich beim Deploy nicht möglich", "Env ONYVA_LOGIN_API_KEY setzen oder OIDC-Verwaltung auf „off“ stellen und Client manuell eintragen.") + elif oc["mode"] != "off": + add("oidckey", "ok", "Login-API", f"Modus {oc['mode']}") + if oc["mode"] != "off" and oc["auth_mode"] == "required" and not oc["members"]: + add("members", "warn", "Freigaben", "auth_mode „required“, aber keine Nutzer gepflegt – niemand kann sich anmelden", + "Domain & Login → Freigaben: mindestens dich eintragen (Nutzer muss im Login existieren).") + if stt_provider != "cortecs": + add("stt", "info", "STT-Provider", stt_provider + " – braucht MISTRAL_API_KEY") + # Inhalt + with session() as db: + t = db.get(Tenant, tenant_id) + try: + val = preview.run(db, t, "current", "validate") + add("render", "ok" if val.get("ok") else "fail", "Veröffentlichter Stand rendert (echter Core)", "; ".join(val.get("errors", []))[:200] or "Web-UI und PDF ok", + "" if val.get("ok") else "Tenant → Editor korrigieren und neu veröffentlichen.") + except Exception as exc: # noqa: BLE001 + add("render", "fail", "Rendering", str(exc)[-200:]) + if draft: + add("draft", "warn", "Unveröffentlichter Entwurf", "wird NICHT mit deployt", "Erst veröffentlichen, wenn er mit soll.") + add("host", "info", "Ziel-URL", f"https://{host}", "") + ready = not any(i["level"] == "fail" for i in out) + return {"ready": ready, "items": out, "host": host, "tag": tag} + + +def _get(url: str) -> int: + import httpx + return httpx.get(url, timeout=8, follow_redirects=True).status_code diff --git a/app/services/preview.py b/app/services/preview.py new file mode 100644 index 0000000..12ca638 --- /dev/null +++ b/app/services/preview.py @@ -0,0 +1,109 @@ +"""Live-Vorschau: führt den vendored Core mit dem (Entwurfs-)Tenant in einem Subprozess aus.""" +from __future__ import annotations + +import hashlib +import json +import os +import shutil +import subprocess +import sys +import tempfile +from pathlib import Path + +from sqlalchemy.orm import Session + +from app.models import Tenant +from app.services import store +from app.services.samples import DEFAULT_SAMPLE +from app.settings import PLATFORM_DIR, PREVIEW_CACHE + +WORKER = Path(__file__).with_name("preview_worker.py") +TIMEOUT = 90 + + +class PreviewError(RuntimeError): + pass + + +def core_version() -> str: + from app.services import contract + return contract.sha()[:10] + + +def sample_for(t: Tenant) -> str: + return t.preview_sample or DEFAULT_SAMPLE + + +EXT = {"index": "html", "pdf": "pdf", "validate": "json", "prompt": "json"} + + +class SourceGone(LookupError): + pass + + +def resolve_content(db: Session, t: Tenant, source: str) -> tuple[dict, dict]: + """draft | current | v | ws: (Live-Arbeitsstand des Agenten) | proposal: (Vorschlag des Agenten).""" + if source.startswith("ws:"): + from app.agent.loop import WORKSPACES + if source[3:] not in WORKSPACES: + raise SourceGone("Der Arbeitsstand des Agenten ist nicht mehr im Speicher (Neustart?). Bitte „Entwurf“ wählen.") + cfg, files = WORKSPACES[source[3:]] + return dict(cfg), dict(files) + if source.startswith("proposal:"): + from app.agent.loop import proposal_content + from app.models import ChatMessage + m = db.get(ChatMessage, int(source[9:] or 0)) + if m is None or m.tenant_id != t.id or not m.proposal: + raise SourceGone("Vorschlag nicht gefunden.") + return proposal_content(db, t, m.proposal) + return store.content(db, t, source) + + +def run(db: Session, t: Tenant, source: str, kind: str, sample: str | None = None, args: dict | None = None) -> bytes | dict: + cfg, files = resolve_content(db, t, source) + return run_content(db, t, cfg, files, kind, sample, args) + + +def run_content(db: Session, t: Tenant, cfg: dict, files: dict, kind: str, sample: str | None = None, + args: dict | None = None) -> bytes | dict: + """Rendert beliebigen Inhalt (cfg + {pfad: sha}) – für Entwurf, Version oder Agent-Workspace.""" + sample = sample if sample is not None else sample_for(t) + h = hashlib.sha256(json.dumps([cfg, files, kind, sample, args or {}, core_version()], sort_keys=True).encode()) + cached = PREVIEW_CACHE / f"{h.hexdigest()[:32]}.{EXT[kind]}" + if not cached.exists(): + _execute(db, t.id, cfg, files, kind, sample, cached, args or {}) + data = cached.read_bytes() + return json.loads(data) if EXT[kind] == "json" else data + + +def _limits() -> None: + import resource + resource.setrlimit(resource.RLIMIT_CPU, (90, 90)) + resource.setrlimit(resource.RLIMIT_FSIZE, (200 * 1024 * 1024,) * 2) + os.setsid() + + +def _execute(db: Session, tenant_id: str, cfg: dict, files: dict, kind: str, sample: str, out: Path, args: dict) -> None: + with tempfile.TemporaryDirectory(prefix="onyscribe-preview-") as tmp_s: + tmp = Path(tmp_s) + shutil.copytree(PLATFORM_DIR / "core", tmp / "core", ignore=shutil.ignore_patterns("__pycache__")) + store.write_tenant_dir(db, cfg, files, tmp / "tenants" / tenant_id) + (tmp / "data").mkdir() + shutil.copy(WORKER, tmp / "preview_worker.py") + env = { + "PATH": os.environ.get("PATH", ""), "HOME": str(tmp), "LANG": "C.UTF-8", + "TENANT": tenant_id, "DATA_DIR": str(tmp / "data"), "AUTH_ENABLED": "false", + "PYTHONPATH": str(tmp), "PYTHONDONTWRITEBYTECODE": "1", + # Kein einziges echtes Secret im Sandbox-Prozess + "OIDC_ISSUER": "https://login.example.invalid", "SESSION_SECRET": "preview", + } + result = tmp / f"result.{out.suffix.lstrip('.')}" + payload = json.dumps({"summary": sample, "title": f"{cfg.get('name', tenant_id)} – Vorschau", **args}) + try: + proc = subprocess.run([sys.executable, "-I", "preview_worker.py", kind, str(result)], input=payload, + cwd=tmp, env=env, capture_output=True, text=True, timeout=TIMEOUT, preexec_fn=_limits) + except subprocess.TimeoutExpired as exc: + raise PreviewError("Vorschau-Timeout (Tenant-Code läuft zu lange)") from exc + if proc.returncode != 0 or not result.exists(): + raise PreviewError((proc.stderr or proc.stdout or "unbekannter Fehler")[-2500:]) + shutil.copy(result, out) diff --git a/app/services/preview_worker.py b/app/services/preview_worker.py new file mode 100644 index 0000000..5f1c07d --- /dev/null +++ b/app/services/preview_worker.py @@ -0,0 +1,65 @@ +"""Läuft in einem isolierten Verzeichnis mit Kopie des Cores + materialisiertem Tenant. + +Aufruf: python preview_worker.py (JSON-Eingabe auf stdin) +Führt den ECHTEN Core aus (auch overrides.py) – deshalb nur als Subprozess ohne Secrets/Netz-Keys. +""" +import json +import os +import sys +import traceback + +sys.path.insert(0, os.getcwd()) + +kind, out = sys.argv[1], sys.argv[2] +args = json.loads(sys.stdin.read() or "{}") + + +def main() -> None: + from core import app as appmod + from core.config import CFG + + if kind == "index": + page = appmod._render_index() + open(out, "w", encoding="utf-8").write(page) + elif kind == "pdf": + pdf = appmod.build_pdf(args.get("title") or "Vorschau", args["summary"], "SPRECHER_0: Beispiel.") + open(out, "wb").write(pdf) + elif kind == "prompt": + base = appmod._summary_prompt() + ctx = {"title": args.get("title", ""), "insurance_type": args.get("terminart", ""), + "customer_2": args.get("projekt", ""), "customer_name": args.get("kunde", ""), "customer_address": ""} + final = appmod.HOOKS.build_prompt(base, ctx) + json.dump({"prompt": final, "chars": len(final)}, open(out, "w")) + elif kind == "validate": + errors, warnings = [], [] + page = appmod._render_index() + if "@@" in page: + errors.append("Web-UI: nicht ersetzte @@PLATZHALTER@@ im Template") + if not CFG.logo_path: + warnings.append("Kein Logo (logo.svg/logo.png) hinterlegt") + if not CFG.favicon_path: + warnings.append("Kein favicon.svg – es wird ein generisches Favicon verwendet") + try: + pdf = appmod.build_pdf("Validierung", args["summary"], "SPRECHER_0: Beispiel.") + if pdf[:5] != b"%PDF-": + errors.append("PDF-Rendering lieferte kein PDF") + except Exception as exc: # noqa: BLE001 + errors.append(f"PDF-Rendering fehlgeschlagen: {exc}") + prompt = CFG.prompt_path.read_text(encoding="utf-8") + if len(prompt.strip()) < 200: + warnings.append("Prompt ist sehr kurz") + json.dump({"ok": not errors, "errors": errors, "warnings": warnings, + "tenant": CFG.id, "prompt_chars": len(prompt)}, open(out, "w")) + + +try: + main() +except SystemExit: + raise +except BaseException: # noqa: BLE001 + tb = traceback.format_exc() + if kind == "validate": + json.dump({"ok": False, "errors": ["Tenant lässt sich nicht laden:\n" + tb[-1500:]], "warnings": []}, open(out, "w")) + else: + sys.stderr.write(tb) + sys.exit(2) diff --git a/app/services/releases.py b/app/services/releases.py new file mode 100644 index 0000000..5258fb1 --- /dev/null +++ b/app/services/releases.py @@ -0,0 +1,254 @@ +"""Core-Releases: Eingang (CI), Kompatibilitätsprüfung aller Tenants, Freigabe, Canary-Rollout, Rollback. + +Ablauf: CI meldet Image-Tag → Admin (läuft auf genau diesem Core) prüft alle Tenants in der Sandbox → Freigabe → +Rollout (Canary zuerst, Abbruch beim ersten Fehler, Health-Check pro Tenant) → aktiver Tag wird der neue Standard. +Gepinnte Tenants nehmen nicht teil. Echte Rollouts brauchen DEPLOY_LIVE=true; sonst nur Dry-Run. +""" +from __future__ import annotations + +import hashlib +import io +import re +import threading +import uuid +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime, timezone + +from sqlalchemy import select + +from app.db import session +from app.models import CoreRelease, Deployment, Setting, Tenant +from app.services import contract, deploy, guard, preview, store + +DATE = re.compile(r"\b\d{1,2}\.\d{1,2}\.\d{2,4}\b") + + +class ReleaseError(RuntimeError): + pass + + +# ── Eingang ───────────────────────────────────────────────────────────────── + +def announce(db, sha: str, tag: str | None, ref: str, image: str, message: str) -> tuple[CoreRelease, bool]: + if not re.fullmatch(r"[0-9a-fA-F]{7,64}", sha or ""): + raise ReleaseError("sha: 7–64 Hex-Zeichen erwartet") + sha = sha.lower() + r = db.scalar(select(CoreRelease).where(CoreRelease.sha == sha)) + created = r is None + if created: + r = CoreRelease(sha=sha, tag=(tag or sha)[:100], ref=ref[:100], image=image[:300], message=message[:500]) + db.add(r) + store.audit(db, "ci", "core.release", None, f"{sha[:10]} ({ref}) {message[:80]}") + else: + r.message, r.ref, r.image = message[:500] or r.message, ref[:100] or r.ref, image[:300] or r.image + db.flush() + return r, created + + +def admin_matches(r: CoreRelease) -> bool: + return contract.same_sha(contract.sha(), r.sha) + + +def view(r: CoreRelease, active_tag: str) -> dict: + return {"id": r.id, "sha": r.sha, "tag": r.tag, "ref": r.ref, "image": r.image, "message": r.message, "status": r.status, + "announced_at": r.announced_at.isoformat() if r.announced_at else None, "admin_matches": admin_matches(r), + "approved_by": r.approved_by, "compat": r.compat, "rollout_batch": r.rollout_batch, "previous_tag": r.previous_tag, + "active": r.tag == active_tag or contract.same_sha(r.sha, active_tag)} + + +# ── Kompatibilitätsprüfung ────────────────────────────────────────────────── + +def _pdf_fingerprint(pdf: bytes) -> tuple[int, str]: + from pypdf import PdfReader + rd = PdfReader(io.BytesIO(pdf)) + text = DATE.sub("", "\n".join((p.extract_text() or "") for p in rd.pages)) # das Tagesdatum steht im PDF + return len(rd.pages), hashlib.sha256(text.encode()).hexdigest() + + +def fingerprint(db, t: Tenant) -> dict: + """Rendert den veröffentlichten Stand mit dem aktuellen Admin-Core und bildet Fingerabdrücke.""" + cfg, files = store.content(db, t, "current") + sample = preview.sample_for(t) + fp: dict = {"sample": hashlib.sha256(sample.encode()).hexdigest()[:12]} + val = preview.run_content(db, t, cfg, files, "validate", sample) + fp["validate"] = {"ok": val.get("ok", False), "errors": val.get("errors", []), "warnings": val.get("warnings", [])} + if val.get("ok"): + pages, text_sha = _pdf_fingerprint(preview.run_content(db, t, cfg, files, "pdf", sample)) + fp.update(pdf_pages=pages, pdf_text=text_sha, + web=hashlib.sha256(preview.run_content(db, t, cfg, files, "index", sample)).hexdigest(), + prompt=hashlib.sha256(preview.run_content(db, t, cfg, files, "prompt", sample, {"title": "x"})["prompt"].encode()).hexdigest()) + fp["schema_problems"] = contract.check_tenant_json(cfg) + return fp + + +def compare(fp: dict, baseline: dict | None, version: int) -> dict: + """→ {status: ok|changed|new|error, changed:[…], errors:[…], warnings:[…]}""" + out = {"status": "ok", "changed": [], "errors": fp["validate"]["errors"], "warnings": list(fp["validate"]["warnings"]) + fp.get("schema_problems", [])} + if not fp["validate"]["ok"]: + out["status"] = "error" + return out + if not baseline or baseline.get("version") != version or baseline["fp"].get("sample") != fp["sample"]: + out["status"] = "new" + return out + labels = {"pdf_pages": "PDF-Seitenzahl", "pdf_text": "PDF-Text", "web": "Web-UI", "prompt": "Finaler Prompt"} + out["changed"] = [labels[k] for k in labels if baseline["fp"].get(k) != fp.get(k)] + if out["changed"]: + out["status"] = "changed" + return out + + +def check(release_id: int, *, force: bool = False, wait: bool = False, workers: int = 3) -> None: + """Prüft ALLE Tenants (außer archivierten) mit dem Core, auf dem die Admin-Plattform läuft. Ergebnis in release.compat.""" + with session() as db: + r = db.get(CoreRelease, release_id) + if r is None: + raise ReleaseError("Release nicht gefunden") + if not force and not admin_matches(r): + raise ReleaseError(f"Die Admin-Plattform läuft noch auf Core {contract.sha()[:10]}, das Release ist {r.sha[:10]}. " + "Erst den Admin neu bauen (FROM neues Core-Image) – sonst würde gegen den falschen Core geprüft.") + ids = [t.id for t in db.scalars(select(Tenant).where(Tenant.status != "archived").order_by(Tenant.id))] + r.compat = {"checked_at": None, "core_sha": contract.sha(), "running": True, "tenants": {}, "summary": {}, "forced": force and not admin_matches(r)} + r.status = "new" if r.status in ("new", "checked") else r.status + + def one(tid: str): + with session() as db: + t = db.get(Tenant, tid) + try: + fp = fingerprint(db, t) + res = compare(fp, t.render_baseline, t.current_version) + except Exception as exc: # noqa: BLE001 + fp, res = {}, {"status": "error", "changed": [], "errors": [f"{type(exc).__name__}: {str(exc)[-300:]}"], "warnings": []} + return tid, fp, res + + def work(): + results = {} + with ThreadPoolExecutor(max_workers=workers) as ex: + for tid, fp, res in ex.map(one, ids): + results[tid] = {**res, "fp": fp} + summary = {k: sum(1 for v in results.values() if v["status"] == k) for k in ("ok", "changed", "new", "error")} + with session() as db: + r = db.get(CoreRelease, release_id) + r.compat = {"checked_at": datetime.now(timezone.utc).isoformat(), "core_sha": contract.sha(), "running": False, "tenants": results, + "summary": summary, "forced": bool(r.compat and r.compat.get("forced"))} + if r.status == "new": + r.status = "checked" + store.audit(db, "system", "core.check", None, f"{r.sha[:10]}: {summary}") + + th = threading.Thread(target=work, daemon=True) + th.start() + if wait: + th.join() + + +# ── Freigabe & Rollout ────────────────────────────────────────────────────── + +def approve(db, release_id: int, actor: str, acknowledge: bool = False) -> CoreRelease: + r = db.get(CoreRelease, release_id) + if r is None: + raise ReleaseError("Release nicht gefunden") + c = r.compat + if not c or c.get("running"): + raise ReleaseError("Erst die Kompatibilitätsprüfung abschließen.") + if not c.get("forced") and not contract.same_sha(c.get("core_sha", ""), r.sha): + raise ReleaseError("Die Prüfung stammt von einem anderen Core als dieses Release – bitte erneut prüfen.") + if c["summary"].get("error"): + bad = [t for t, v in c["tenants"].items() if v["status"] == "error"] + raise ReleaseError(f"Nicht freigebbar: {len(bad)} Tenant(s) mit Fehlern ({', '.join(bad)}).") + if c["summary"].get("changed") and not acknowledge: + raise ReleaseError("Bei einigen Tenants hat sich das Rendering geändert – bitte prüfen und bewusst bestätigen (acknowledge).") + r.status, r.approved_by, r.approved_at = "approved", actor, datetime.now(timezone.utc) + store.audit(db, actor, "core.approve", None, r.sha[:10]) + return r + + +def canary_list(db) -> list[str]: + s = db.get(Setting, "canary_tenants") + return [x.strip() for x in (s.value if s and s.value else "demo").split(",") if x.strip()] + + +def _set_setting(db, key: str, value: str) -> None: + s = db.get(Setting, key) + if s is None: + s = Setting(key=key) + db.add(s) + s.value = value + + +def rollout(release_id: int, actor: str, *, dry_run: bool, http=None, oidc_client=None, health=None, wait: bool = False) -> tuple[str, list[int]]: + live = not dry_run + if live and not deploy.live_enabled(): + raise ReleaseError("Echte Rollouts sind gesperrt (DEPLOY_LIVE != true). Dry-Run ist möglich.") + with session() as db: + r = db.get(CoreRelease, release_id) + if r is None: + raise ReleaseError("Release nicht gefunden") + allowed = {"approved", "active", "failed", "rolled_back"} | ({"new", "checked"} if dry_run else set()) # Dry-Run schon vor der Freigabe + if r.status not in allowed: + raise ReleaseError(f"Release ist im Status „{r.status}“ – erst prüfen und freigeben.") + tag, sha = r.tag, r.sha + ids = [t.id for t in db.scalars(select(Tenant).where(Tenant.status == "active").order_by(Tenant.id)) if not t.core_pin] + if live: # Live: nur für Live-Schreibzugriffe freigegebene Tenants (guard.py) + ids = [t for t in ids if guard.live_allowed(t)] + if not ids: + raise ReleaseError(f"Kein Tenant für Live-Rollouts freigegeben (DEPLOY_ALLOWED_TENANTS = {guard.describe()}).") + canary = canary_list(db) + batch = uuid.uuid4().hex[:10] + if live: + r.status, r.previous_tag, r.rollout_batch = "rolling", deploy.setting(db, "core_image_tag", "latest"), batch + store.audit(db, actor, "core.rollout", None, f"{sha[:10]} → {len(ids)} Tenants") + + def done(ok: bool, results: dict): + if not live: + return + with session() as db: + r = db.get(CoreRelease, release_id) + if ok: + r.status = "active" + _set_setting(db, "core_image_tag", tag) + for other in db.scalars(select(CoreRelease).where(CoreRelease.status == "active", CoreRelease.id != release_id)): + other.status = "superseded" + for tid in results: # Baselines für künftige Kompatibilitätsprüfungen + t = db.get(Tenant, tid) + c = ((r.compat or {}).get("tenants") or {}).get(tid) + if t and c and c.get("fp"): + t.render_baseline = {"version": t.current_version, "core": sha, "fp": c["fp"]} + else: + r.status = "failed" + store.audit(db, "system", "core.rollout.done", None, f"{sha[:10]} {'ok' if ok else 'FEHLER'} {results}") + + dep_ids = deploy.run_sequence(ids, "dry-run" if dry_run else "deploy", actor, batch=batch, core_tag=tag, http=http, oidc_client=oidc_client, + health=health, canary=canary, wait=wait, on_done=done) + return batch, dep_ids + + +def rollback_release(release_id: int, actor: str, *, http=None, oidc_client=None, health=None, wait: bool = False) -> tuple[str, list[int]]: + """Alle (nicht gepinnten) Tenants auf den Tag vor diesem Rollout zurück.""" + if not deploy.live_enabled(): + raise ReleaseError("Echte Rollbacks sind gesperrt (DEPLOY_LIVE != true).") + with session() as db: + r = db.get(CoreRelease, release_id) + if r is None or not r.previous_tag: + raise ReleaseError("Kein vorheriger Tag bekannt – Rollback nicht möglich.") + prev = r.previous_tag + ids = [t.id for t in db.scalars(select(Tenant).where(Tenant.status == "active").order_by(Tenant.id)) if not t.core_pin and guard.live_allowed(t.id)] + batch = uuid.uuid4().hex[:10] + store.audit(db, actor, "core.rollback", None, f"{r.sha[:10]} → :{prev}") + + def done(ok, results): + with session() as db: + r = db.get(CoreRelease, release_id) + if ok: + r.status = "rolled_back" + _set_setting(db, "core_image_tag", prev) + store.audit(db, "system", "core.rollback.done", None, f"{'ok' if ok else 'FEHLER'} {results}") + + return batch, deploy.run_sequence(ids, "deploy", actor, batch=batch, core_tag=prev, http=http, oidc_client=oidc_client, health=health, wait=wait, on_done=done) + + +def tenant_rollback_tag(db, t: Tenant) -> str | None: + """Letzter erfolgreich live deployter Tag dieses Tenants, der vom aktuellen abweicht.""" + for d in db.scalars(select(Deployment).where(Deployment.tenant_id == t.id, Deployment.kind == "deploy", Deployment.status == "success", + Deployment.simulated.is_(False)).order_by(Deployment.id.desc())): + if d.image_tag and d.image_tag != t.deployed_image: + return d.image_tag + return None diff --git a/app/services/samples.py b/app/services/samples.py new file mode 100644 index 0000000..0656c58 --- /dev/null +++ b/app/services/samples.py @@ -0,0 +1,76 @@ +"""Beispielprotokolle für die PDF-Vorschau (so, wie der LLM sie liefern würde).""" + +DEFAULT_SAMPLE = """===TERMINART=== +Kick-off +===/TERMINART=== +===PROJEKT=== +Muster GmbH +Relaunch 2026 +===/PROJEKT=== +===KONTAKT=== +Max Mustermann - Geschäftsführer +Erika Beispiel - Projektleitung +===/KONTAKT=== +Anlass & Kontext +Erstes Kennenlernen und Abstecken des Projektrahmens. Ziel ist ein gemeinsames Verständnis von Umfang, Zeitplan und Zuständigkeiten. +Besprochene Themen +• Zeitplan und Meilensteine bis zum Go-live im Herbst +• Budgetrahmen und Freigabeprozess +• Anbindung des bestehenden CRM +Entscheidungen +• Projektstart im Juli +• Wöchentlicher Jour fixe, dienstags 10:00 Uhr +Action Items +• Angebot bis Freitag senden [Verantwortlich: Erika Beispiel, Frist: 18.07.] +• Zugänge zum CRM bereitstellen [Verantwortlich: Max Mustermann, Frist: 22.07.] +Offene Punkte +• Finale Designrichtung noch nicht entschieden +• Datenschutzfreigabe der Fachabteilung steht aus +Nächste Schritte +• Folgetermin zum Konzept-Review vereinbaren +""" + +ROTARY_SAMPLE = """===TERMINART=== +Clubmeeting +===/TERMINART=== +===PROJEKT=== +Lieferketten im Wandel +===/PROJEKT=== +Begrüßung +Der Präsident eröffnet das Meeting und begrüßt die anwesenden Freunde sowie zwei Gäste. +Geburtstage +• Anna Beispiel +• Peter Muster +Aktuelle 5 Minuten +Kurzer Bericht zum Stand der Spendenaktion für das Jugendprojekt. Bisher sind 4.200 Euro zusammengekommen. +Happy Euro +• Für die gelungene Veranstaltung am Samstag +• Für das gute Wetter beim Grillfest +Vortrag / Referat +Globalisierung – historische Einordnung +Der Referent ordnet die Entwicklung der globalen Lieferketten seit den 1990er-Jahren ein. +Folgen für die Region +• Abhängigkeit von wenigen Zulieferern +• Chancen durch regionale Wertschöpfung +Dank +Der Präsident dankt dem Referenten für den anregenden Vortrag. +Abschluss +Nächstes Meeting am kommenden Montag. +""" + +SAMPLE_TRANSCRIPT = """SPRECHER_0: Guten Morgen zusammen, schön, dass wir uns heute zum Kick-off treffen. Ich bin Erika Beispiel, Projektleitung auf unserer Seite. +SPRECHER_1: Morgen. Max Mustermann, ich bin Geschäftsführer der Muster GmbH. Wir wollen unsere Website bis zum Herbst neu aufsetzen. +SPRECHER_0: Gut. Dann starten wir im Juli. Ich würde einen wöchentlichen Jour fixe vorschlagen, dienstags um zehn. +SPRECHER_1: Passt. Das Budget liegt bei etwa vierzigtausend Euro, die Freigabe läuft über mich. +SPRECHER_0: Ich schicke Ihnen bis Freitag das Angebot. Und wir brauchen von Ihnen die Zugänge zum CRM, möglichst bis zum zweiundzwanzigsten Juli. +SPRECHER_1: Mache ich. Offen ist noch die Designrichtung und ob die Datenschutzabteilung zustimmt. +SPRECHER_0: Dann vereinbaren wir als Nächstes einen Termin zum Konzept-Review. +""" + +ROTARY_TRANSCRIPT = """SPRECHER_0: Liebe Freunde, ich begrüße euch zum Clubmeeting und freue mich über zwei Gäste heute Abend. +SPRECHER_0: Geburtstag haben diese Woche Anna Beispiel und Peter Muster, herzlichen Glückwunsch. +SPRECHER_1: Zur Spendenaktion für das Jugendprojekt: Wir haben bisher viertausendzweihundert Euro zusammen. +SPRECHER_2: Happy Euro für das schöne Wetter beim Grillfest und für die gelungene Veranstaltung am Samstag. +SPRECHER_3: Mein Vortrag heute: Globalisierung und Lieferketten. Seit den Neunzigern hat sich die Abhängigkeit von wenigen Zulieferern stark erhöht. Für unsere Region bedeutet das Risiken, aber auch Chancen durch regionale Wertschöpfung. +SPRECHER_0: Vielen Dank für den Vortrag. Nächstes Meeting ist am kommenden Montag. +""" diff --git a/app/services/seed.py b/app/services/seed.py new file mode 100644 index 0000000..47c7453 --- /dev/null +++ b/app/services/seed.py @@ -0,0 +1,54 @@ +"""Seed-Export/-Import: Startdaten (importierte Tenants) als Datei im Repo. + +So startet eine frische Instanz (z. B. Coolify) mit den aktuellen Tenants, ohne Zugriff auf das alte Git-Repo. +Secrets-WERTE sind nie enthalten – nur die Schlüsselnamen. +""" +from __future__ import annotations + +import base64 +import gzip +import json +from pathlib import Path + +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.models import Blob, Secret, Setting, Tenant, Version + +COLS = ["id", "name", "status", "source", "subdomain", "custom_domain", "domain_status", "cpu", "memory", + "current_version", "deployed_version", "deployed_image", "preview_sample", "oidc", "notes"] + + +def export(db: Session, path: Path) -> None: + tenants = db.scalars(select(Tenant).order_by(Tenant.id)).all() + shas = set() + out = {"tenants": [], "versions": [], "secrets": [], "settings": {}} + for t in tenants: + out["tenants"].append({c: getattr(t, c) for c in COLS}) + for v in db.scalars(select(Version).where(Version.tenant_id == t.id).order_by(Version.number)): + out["versions"].append({"tenant_id": t.id, "number": v.number, "message": v.message, "author": v.author, + "config": v.config, "files": v.files}) + shas |= set(v.files.values()) + for s in db.scalars(select(Secret)): + out["secrets"].append({"tenant_id": s.tenant_id, "key": s.key}) + out["settings"] = {s.key: s.value for s in db.scalars(select(Setting))} + out["blobs"] = {sha: {"b64": base64.b64encode(db.get(Blob, sha).content).decode(), "text": db.get(Blob, sha).is_text} for sha in shas} + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(gzip.compress(json.dumps(out).encode(), 9)) + + +def load(db: Session, path: Path) -> int: + data = json.loads(gzip.decompress(path.read_bytes())) + for sha, b in data["blobs"].items(): + raw = base64.b64decode(b["b64"]) + db.add(Blob(sha=sha, content=raw, size=len(raw), is_text=b["text"])) + for t in data["tenants"]: + db.add(Tenant(**t)) + db.flush() + for v in data["versions"]: + db.add(Version(**v)) + for s in data["secrets"]: + db.add(Secret(tenant_id=s["tenant_id"], key=s["key"], value_enc=None, source="sops-import")) + for k, v in data["settings"].items(): + db.add(Setting(key=k, value=v)) + return len(data["tenants"]) diff --git a/app/services/status.py b/app/services/status.py new file mode 100644 index 0000000..ab6248e --- /dev/null +++ b/app/services/status.py @@ -0,0 +1,61 @@ +"""Zustandsabgleich: was läuft wirklich? (Vertrag: GET /health → core.version, bundle.source/version/stale)""" +from __future__ import annotations + +import time +from concurrent.futures import ThreadPoolExecutor + +from sqlalchemy import select + +from app.db import session +from app.models import Tenant +from app.services import contract, deploy + +_CACHE: dict = {"ts": 0.0, "data": None} +TTL = 30.0 + + +def _http_get(url: str): + import httpx + r = httpx.get(url, timeout=6, follow_redirects=True) + return r.status_code, (r.json() if r.headers.get("content-type", "").startswith("application/json") else {}) + + +def probe(host: str, expect_tag: str, expect_bundle: int | None, get=_http_get) -> dict: + out = {"host": host, "reachable": False, "core": None, "bundle": None, "drift": [], "error": None} + try: + status, body = get(f"https://{host}/health") + except Exception as exc: # noqa: BLE001 + out["error"] = f"{type(exc).__name__}: {str(exc)[:120]}" + out["drift"].append("nicht erreichbar") + return out + out["reachable"] = status == 200 + if status != 200: + out["drift"].append(f"HTTP {status}") + core, bundle = body.get("core"), body.get("bundle") + out["core"], out["bundle"] = core, bundle + if core is None: + out["drift"].append("Core ohne Vertrag (alte Version)") + elif expect_tag and deploy._hex_tag(expect_tag) and not contract.same_sha(core.get("version", ""), expect_tag): + out["drift"].append(f"Core {core.get('version', '')[:10]} statt {expect_tag[:10]}") + if expect_bundle is not None: + if not bundle: + out["drift"].append("meldet keine Bundle-Quelle") + elif bundle.get("source") != "admin" or bundle.get("version") != expect_bundle or bundle.get("stale"): + out["drift"].append(f"Bundle {bundle.get('source')} v{bundle.get('version')}{' (veraltet)' if bundle.get('stale') else ''} statt admin v{expect_bundle}") + elif bundle and bundle.get("source") not in ("git", None): + out["drift"].append(f"Bundle-Quelle {bundle.get('source')}, erwartet git") + return out + + +def probe_all(get=_http_get, refresh: bool = False, workers: int = 6) -> dict: + if not refresh and _CACHE["data"] is not None and time.time() - _CACHE["ts"] < TTL: + return _CACHE["data"] + with session() as db: + items = [] + for t in db.scalars(select(Tenant).where(Tenant.status == "active").order_by(Tenant.id)): + items.append((t.id, deploy.host_for(db, t), deploy.effective_tag(db, t), t.current_version if t.source == "admin" else None)) + with ThreadPoolExecutor(max_workers=workers) as ex: + res = list(ex.map(lambda it: (it[0], probe(it[1], it[2], it[3], get)), items)) + data = {tid: r for tid, r in res} + _CACHE.update(ts=time.time(), data=data) + return data diff --git a/app/services/store.py b/app/services/store.py new file mode 100644 index 0000000..85eea58 --- /dev/null +++ b/app/services/store.py @@ -0,0 +1,225 @@ +"""Inhalte eines Tenants: Blobs, Entwurf, Versionen, Diff, Bundle. + +Ein Tenant besteht aus `config` (Inhalt der tenant.json ohne deploy-Block) und +`files` ({pfad: sha}). Bearbeitet wird immer ein Entwurf (tenant.draft); +„Veröffentlichen“ schreibt daraus eine neue unveränderliche Version. +""" +from __future__ import annotations + +import difflib +import hashlib +import io +import json +import tarfile +from copy import deepcopy + +from sqlalchemy import select +from sqlalchemy.orm import Session +from sqlalchemy.orm.attributes import flag_modified + +from app.models import AuditLog, Blob, Tenant, Version + +TEXT_SUFFIXES = {".txt", ".html", ".css", ".py", ".json", ".svg", ".md", ".yaml", ".yml", ".csv"} +RESERVED = {"tenant.json"} # wird aus config erzeugt + + +def is_text_path(path: str) -> bool: + return any(path.lower().endswith(s) for s in TEXT_SUFFIXES) + + +def put_blob(db: Session, data: bytes, path: str = "") -> str: + sha = hashlib.sha256(data).hexdigest() + if db.get(Blob, sha) is None: + db.add(Blob(sha=sha, content=data, size=len(data), is_text=is_text_path(path))) + db.flush() + return sha + + +def get_blob(db: Session, sha: str) -> bytes: + b = db.get(Blob, sha) + if b is None: + raise KeyError(sha) + return b.content + + +def audit(db: Session, actor: str, action: str, tenant_id: str | None = None, detail: str = "") -> None: + db.add(AuditLog(actor=actor, action=action, tenant_id=tenant_id, detail=detail)) + + +def current_version(db: Session, t: Tenant) -> Version | None: + if t.current_version is None: + return None + return db.scalar(select(Version).where(Version.tenant_id == t.id, Version.number == t.current_version)) + + +def get_version(db: Session, tenant_id: str, number: int) -> Version | None: + return db.scalar(select(Version).where(Version.tenant_id == tenant_id, Version.number == number)) + + +def content(db: Session, t: Tenant, source: str = "draft") -> tuple[dict, dict]: + """(config, files) für source = draft | current | v. Draft fällt auf current zurück.""" + if source == "draft" and t.draft: + return deepcopy(t.draft["config"]), dict(t.draft["files"]) + if source.startswith("v") and source[1:].isdigit(): + v = get_version(db, t.id, int(source[1:])) + else: + v = current_version(db, t) + if v is None: + return {}, {} + return deepcopy(v.config), dict(v.files) + + +def ensure_draft(db: Session, t: Tenant) -> dict: + """Arbeitskopie des Entwurfs (nie das am ORM-Objekt hängende Dict mutieren).""" + if t.draft: + return json.loads(json.dumps(t.draft)) + cfg, files = content(db, t, "current") + return {"config": cfg, "files": files} + + +def _save_draft(t: Tenant, draft: dict) -> None: + t.draft = json.loads(json.dumps(draft)) + flag_modified(t, "draft") + + +def set_config(db: Session, t: Tenant, config: dict) -> None: + d = ensure_draft(db, t) + config = {k: v for k, v in config.items() if k != "deploy"} + config["id"] = t.id + d["config"] = config + _save_draft(t, d) + _sync_draft_state(db, t) + + +def set_file(db: Session, t: Tenant, path: str, data: bytes) -> str: + path = clean_path(path) + d = ensure_draft(db, t) + sha = put_blob(db, data, path) + d["files"][path] = sha + _save_draft(t, d) + _sync_draft_state(db, t) + return sha + + +def delete_file(db: Session, t: Tenant, path: str) -> None: + d = ensure_draft(db, t) + d["files"].pop(path, None) + _save_draft(t, d) + _sync_draft_state(db, t) + + +def clean_path(path: str) -> str: + path = path.strip().lstrip("/") + if not path or ".." in path.split("/") or path in RESERVED or "\\" in path: + raise ValueError(f"Ungültiger Dateipfad: {path!r}") + return path + + +def _sync_draft_state(db: Session, t: Tenant) -> None: + """Entwurf, der identisch zur aktuellen Version ist, wieder löschen.""" + if t.draft and not diff_summary(db, t, "current", "draft")["changed"]: + t.draft = None + + +def discard_draft(db: Session, t: Tenant) -> None: + t.draft = None + + +def publish(db: Session, t: Tenant, message: str, author: str) -> Version: + if not t.draft: + raise ValueError("Kein Entwurf zum Veröffentlichen.") + number = (t.current_version or 0) + 1 + last = db.scalar(select(Version.number).where(Version.tenant_id == t.id).order_by(Version.number.desc())) + number = max(number, (last or 0) + 1) + v = Version(tenant_id=t.id, number=number, message=message.strip() or f"Version {number}", author=author, + config=t.draft["config"], files=t.draft["files"]) + db.add(v) + t.current_version = number + t.draft = None + t.name = v.config.get("name", t.name) + audit(db, author, "version.publish", t.id, f"v{number}: {v.message}") + db.flush() + return v + + +def restore_as_draft(db: Session, t: Tenant, number: int) -> None: + v = get_version(db, t.id, number) + if v is None: + raise KeyError(number) + t.draft = {"config": deepcopy(v.config), "files": dict(v.files)} + _sync_draft_state(db, t) + + +# ── Diff ──────────────────────────────────────────────────────────────────── + +def diff_summary(db: Session, t: Tenant, a: str, b: str, with_text: bool = False) -> dict: + return diff_content(db, content(db, t, a), content(db, t, b), with_text) + + +def diff_content(db: Session, left: tuple[dict, dict], right: tuple[dict, dict], with_text: bool = False) -> dict: + ca, fa = left + cb, fb = right + items = [] + if json.dumps(ca, sort_keys=True) != json.dumps(cb, sort_keys=True): + items.append(_item("tenant.json", "geändert", db, json.dumps(ca, indent=2, ensure_ascii=False, sort_keys=True), + json.dumps(cb, indent=2, ensure_ascii=False, sort_keys=True), True, with_text)) + for path in sorted(set(fa) | set(fb)): + sa, sb = fa.get(path), fb.get(path) + if sa == sb: + continue + kind = "neu" if sa is None else "gelöscht" if sb is None else "geändert" + text = is_text_path(path) + ta = get_blob(db, sa).decode("utf-8", "replace") if (sa and text and with_text) else "" + tb = get_blob(db, sb).decode("utf-8", "replace") if (sb and text and with_text) else "" + items.append(_item(path, kind, db, ta, tb, text, with_text)) + return {"changed": bool(items), "items": items} + + +def _item(path, kind, db, ta, tb, text, with_text): + out = {"path": path, "kind": kind, "text": text} + if with_text and text: + lines = list(difflib.unified_diff(ta.splitlines(), tb.splitlines(), "vorher", "nachher", lineterm="", n=2)) + out["diff"] = lines + out["added"] = sum(1 for l in lines if l.startswith("+") and not l.startswith("+++")) + out["removed"] = sum(1 for l in lines if l.startswith("-") and not l.startswith("---")) + return out + + +# ── Bundle (genau das, was ein Tenant-Container beim Start abholt) ────────── + +def tenant_json_bytes(config: dict) -> bytes: + return (json.dumps(config, indent=2, ensure_ascii=False) + "\n").encode() + + +def materialize(db: Session, t: Tenant, source: str, target) -> dict: + """Schreibt das Tenant-Verzeichnis (tenant.json + Dateien) nach `target`.""" + cfg, files = content(db, t, source) + write_tenant_dir(db, cfg, files, target) + return cfg + + +def write_tenant_dir(db: Session, cfg: dict, files: dict, target) -> None: + target.mkdir(parents=True, exist_ok=True) + (target / "tenant.json").write_bytes(tenant_json_bytes(cfg)) + for path, sha in files.items(): + p = target / path + p.parent.mkdir(parents=True, exist_ok=True) + p.write_bytes(get_blob(db, sha)) + + +def bundle_tar(db: Session, t: Tenant, source: str = "current") -> tuple[bytes, dict]: + cfg, files = content(db, t, source) + manifest = {"tenant": t.id, "version": t.current_version if source != "draft" else None, + "files": {"tenant.json": hashlib.sha256(tenant_json_bytes(cfg)).hexdigest(), **files}} + buf = io.BytesIO() + with tarfile.open(fileobj=buf, mode="w:gz") as tar: + def add(name, data): + ti = tarfile.TarInfo(name) + ti.size = len(data) + ti.mtime = 0 + tar.addfile(ti, io.BytesIO(data)) + add("tenant.json", tenant_json_bytes(cfg)) + for path, sha in sorted(files.items()): + add(path, get_blob(db, sha)) + add("MANIFEST.json", json.dumps(manifest, indent=2).encode()) + return buf.getvalue(), manifest diff --git a/app/services/tenants.py b/app/services/tenants.py new file mode 100644 index 0000000..c4dd6cc --- /dev/null +++ b/app/services/tenants.py @@ -0,0 +1,95 @@ +"""Tenant-Lebenszyklus: anlegen, klonen, Secrets, Cut-over-Check.""" +from __future__ import annotations + +import re +from copy import deepcopy + +from sqlalchemy import select +from sqlalchemy.orm import Session + +from app.models import Deployment, Secret, Tenant, Version +from app.services import crypto, defaults, store + +SLUG = re.compile(r"^[a-z0-9][a-z0-9-]{1,38}$") + + +def create(db: Session, tenant_id: str, name: str, clone_from: str | None, actor: str) -> Tenant: + tenant_id = tenant_id.strip().lower() + if not SLUG.match(tenant_id): + raise ValueError("ID: nur a-z, 0-9 und Bindestrich, 2–39 Zeichen.") + if db.get(Tenant, tenant_id): + raise ValueError(f"Tenant „{tenant_id}“ existiert bereits.") + t = Tenant(id=tenant_id, name=name.strip() or tenant_id, subdomain=tenant_id, domain_status="none", source="admin", + oidc={"mode": "managed"}) + db.add(t) + db.flush() + if clone_from: + src = db.get(Tenant, clone_from) + cfg, files = store.content(db, src, "current") + cfg = deepcopy(cfg) + cfg.update({"id": tenant_id, "name": t.name, "title": f"{t.name} – Gesprächsprotokoll", + "description": f"Gesprächsprotokoll-Tool für {t.name}", "ai_detect_org": t.name, "org_short": t.name}) + # Personenbezogene/mandantenspezifische Dateien nicht mitklonen + files = {p: s for p, s in files.items() if not p.startswith("namensliste")} + t.cpu, t.memory = src.cpu, src.memory + else: + cfg, files = defaults.skeleton_config(tenant_id, t.name), {} + db.add(Version(tenant_id=tenant_id, number=1, message="Angelegt" + (f" (Kopie von {clone_from})" if clone_from else ""), + author=actor, config=cfg, files=files)) + t.current_version = 1 + for key, val in (("SESSION_SECRET", defaults.new_token()), ("ADMIN_BUNDLE_TOKEN", defaults.new_token())): + db.add(Secret(tenant_id=tenant_id, key=key, value_enc=crypto.encrypt(val), source="manual")) + for key in ("OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET", "COST_INGEST_KEY"): + db.add(Secret(tenant_id=tenant_id, key=key, value_enc=None, source="manual")) + store.audit(db, actor, "tenant.create", tenant_id, f"Kopie von {clone_from}" if clone_from else "leer") + db.flush() + return t + + +def secret_rows(db: Session, tenant_id: str) -> list[dict]: + rows = {s.key: s for s in db.scalars(select(Secret).where(Secret.tenant_id == tenant_id))} + keys = list(dict.fromkeys(defaults.REQUIRED_SECRETS + [k for k in rows if k not in defaults.REQUIRED_SECRETS])) + out = [] + for k in keys: + r = rows.get(k) + out.append({ + "key": k, "set": bool(r and r.value_enc), "source": r.source if r else "", + "required": k in defaults.REQUIRED_SECRETS, "help": defaults.SECRET_HELP.get(k, ""), + "updated_at": r.updated_at.isoformat() if r and r.updated_at else None, + }) + return out + + +def set_secret(db: Session, tenant_id: str, key: str, value: str | None, actor: str) -> None: + if not re.match(r"^[A-Z][A-Z0-9_]{1,60}$", key): + raise ValueError("Schlüssel: GROSSBUCHSTABEN_MIT_UNTERSTRICH") + r = db.scalar(select(Secret).where(Secret.tenant_id == tenant_id, Secret.key == key)) + if r is None: + r = Secret(tenant_id=tenant_id, key=key) + db.add(r) + r.value_enc = crypto.encrypt(value) if value else None + r.source = "manual" + store.audit(db, actor, "secret.set" if value else "secret.clear", tenant_id, key) + + +def check_bundle_token(db: Session, tenant_id: str, token: str) -> bool: + r = db.scalar(select(Secret).where(Secret.tenant_id == tenant_id, Secret.key == "ADMIN_BUNDLE_TOKEN")) + return bool(r and r.value_enc and token and crypto.decrypt(r.value_enc) == token) + + +def cutover_checks(db: Session, t: Tenant, validation: dict | None) -> list[dict]: + secrets_ok = all(s["set"] for s in secret_rows(db, t.id) if s["required"]) + imported = db.scalar(select(Version).where(Version.tenant_id == t.id, Version.author == "import")) is not None + dry = db.scalar(select(Deployment).where(Deployment.tenant_id == t.id, Deployment.kind == "dry-run", + Deployment.status == "success").order_by(Deployment.id.desc())) + return [ + {"id": "content", "label": "Inhalt aus Git importiert & Hash-gleich verifiziert" if imported else "Inhalt in der Datenbank", + "ok": True}, + {"id": "validate", "label": "Validierung (Core-Rendering von Web-UI und PDF)", "ok": bool(validation and validation.get("ok"))}, + {"id": "secrets", "label": "Alle Pflicht-Secrets in der Admin-DB gesetzt", "ok": secrets_ok}, + {"id": "oidc", "label": "OIDC-Client abgeglichen (Login-API)" if (t.oidc or {}).get("mode", "adopt") != "off" else "OIDC-Verwaltung aus", + "ok": (t.oidc or {}).get("mode", "adopt") == "off" or bool(((t.oidc or {}).get("last_sync") or {}).get("ok"))}, + {"id": "domain", "label": "Domain verifiziert", "ok": t.domain_status == "verified"}, + {"id": "dryrun", "label": "Dry-Run erfolgreich", "ok": dry is not None}, + {"id": "published", "label": "Keine unveröffentlichten Änderungen", "ok": not t.draft}, + ] diff --git a/app/settings.py b/app/settings.py new file mode 100644 index 0000000..2df2595 --- /dev/null +++ b/app/settings.py @@ -0,0 +1,33 @@ +"""Zentrale Konfiguration (Env-getrieben).""" +from __future__ import annotations + +import base64 +import hashlib +import os +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +if not os.getenv("ONYSCRIBE_SKIP_DOTENV"): # lokale Entwicklung: .env im Projektordner einlesen (Docker/Coolify setzen die Env direkt) + try: + from dotenv import load_dotenv + load_dotenv(ROOT / ".env", override=False) # echte Umgebungsvariablen haben Vorrang + except ImportError: + pass +DATA = ROOT / ".data" +DATA.mkdir(exist_ok=True) + +DATABASE_URL = os.getenv("DATABASE_URL", f"sqlite:///{DATA / 'onyscribe-admin.db'}") +# Entwicklungs-Fallback: abgeleiteter Key. In Produktion SECRET_KEY setzen! +_raw = os.getenv("SECRET_KEY", "").strip() +SECRET_KEY = _raw or base64.urlsafe_b64encode(hashlib.sha256(b"onyscribe-admin-dev").digest()).decode() +AUTH_ENABLED = os.getenv("AUTH_ENABLED", "false").lower() == "true" + +# Vendored Snapshot des Plattform-Cores (Preview führt den echten Core aus) +PLATFORM_DIR = Path(os.getenv("PLATFORM_DIR", ROOT / "vendor" / "platform")) +PREVIEW_CACHE = ROOT / ".preview-cache" +PREVIEW_CACHE.mkdir(exist_ok=True) + +# Pfad zur bestehenden transkript-platform (nur für den Importer) +LEGACY_PLATFORM = Path(os.getenv("LEGACY_PLATFORM", ROOT.parent / "transkript-platform")) + +APP_NAME = "Onyscribe Admin" diff --git a/app/static/admin.css b/app/static/admin.css new file mode 100644 index 0000000..fd4686a --- /dev/null +++ b/app/static/admin.css @@ -0,0 +1,170 @@ +:root{ + --creme:#f4efe8; --dark:#1a1a1a; --cyan:#00cccc; --cyan-d:#009e9e; --white:#fff; --stone:#eceae4; --mist:#f7f4f0; + --border:#ddd8d0; --gray:#888; --mid:#555; --ok:#2a8a2a; --warn:#e0a000; --err:#c0392b; + --font:"Liberation Sans",Arial,Helvetica,sans-serif; --mono:ui-monospace,"JetBrains Mono","Liberation Mono",Menlo,monospace; +} +*{box-sizing:border-box} +html,body{margin:0;height:100%} +body{font-family:var(--font);background:var(--creme);color:#2c2c2c;font-size:13px;line-height:1.45;display:flex} +a{color:inherit} +h1,h2,h3{margin:0;color:var(--dark)} +button,input,select,textarea{font:inherit} +.muted{color:var(--gray)} .mono{font-family:var(--mono);font-size:12px} .grow{flex:1;min-width:0} +.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap} +.nowrap{white-space:nowrap} + +/* ── Sidebar ─────────────────────────────────────────────── */ +.side{width:196px;flex:none;background:var(--dark);color:#d8d4cc;display:flex;flex-direction:column;height:100vh;position:sticky;top:0;border-right:2px solid var(--cyan)} +.brand{padding:18px 18px 12px} +.brand b{color:#fff;font-size:19px;letter-spacing:-.3px} +.brand span{display:block;color:var(--cyan);font-size:9.5px;font-weight:700;letter-spacing:2px;text-transform:uppercase} +.nav{padding:6px 8px;display:flex;flex-direction:column;gap:1px} +.nav a{display:flex;gap:9px;align-items:center;padding:7px 10px;border-radius:7px;text-decoration:none;color:#bdb8ae;font-weight:600} +.nav a:hover{background:#262626;color:#fff} .nav a.on{background:#262626;color:#fff;box-shadow:inset 3px 0 0 var(--cyan)} +.nav svg{width:15px;height:15px;flex:none} +.side-foot{margin-top:auto;padding:12px 16px;font-size:11px;color:#8a867e;border-top:1px solid #2c2c2c;display:flex;flex-direction:column;gap:6px} +.pill{display:inline-block;border-radius:4px;padding:1px 7px;font-weight:700;letter-spacing:.8px;font-size:9.5px;text-transform:uppercase;width:fit-content} +.pill.lock{background:#3a2f12;color:#f0c55a} .pill.live{background:#4a1d17;color:#ff9a8a} .pill.dev{background:#2c2c2c;color:var(--cyan)} +.side-foot a{color:#bdb8ae} + +/* ── Seiten-Layout ───────────────────────────────────────── */ +.main{flex:1;min-width:0;display:flex;flex-direction:column;height:100vh;overflow:auto} +.page{padding:22px 28px 50px;max-width:1500px;width:100%} +.eyebrow{font-size:10.5px;font-weight:700;letter-spacing:1.8px;color:var(--gray);text-transform:uppercase} +.eyebrow::before{content:"— ";color:var(--cyan)} +.title{font-size:24px;font-weight:700;letter-spacing:-.4px;margin:2px 0 0} +.lead{color:var(--mid);margin:4px 0 0;max-width:760px} +.head{display:flex;gap:16px;align-items:flex-end;justify-content:space-between;margin-bottom:16px;flex-wrap:wrap} + +/* ── Cards ───────────────────────────────────────────────── */ +.card{background:var(--white);border:1px solid var(--border);border-radius:10px;padding:14px 16px} +.card + .card,.card + .grid2,.grid2 + .card{margin-top:12px} +.card h3{font-size:13.5px;margin-bottom:8px} +.card .sub{color:var(--gray);font-size:12px;margin:-4px 0 10px} +.grid2{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px} +.grid2 > .card{margin:0!important} +.kpis{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px} +.kpi{background:var(--white);border:1px solid var(--border);border-radius:9px;padding:7px 13px;display:flex;gap:9px;align-items:baseline;cursor:default} +.kpi b{font-size:18px;color:var(--dark)} .kpi span{color:var(--gray);font-size:10.5px;font-weight:700;letter-spacing:1.2px;text-transform:uppercase} +.kpi.click{cursor:pointer} .kpi.click:hover{border-color:var(--cyan)} + +/* ── Badges / Buttons ────────────────────────────────────── */ +.badge{display:inline-flex;align-items:center;gap:4px;font-size:10.5px;font-weight:700;border-radius:999px;padding:1px 8px;background:var(--stone);color:var(--mid);white-space:nowrap;line-height:1.6} +.badge.ok{background:#e3f3e3;color:var(--ok)} .badge.warn{background:#fbf0cf;color:#8a6200} +.badge.err{background:#f8dcd8;color:var(--err)} .badge.cyan{background:#d6f5f5;color:#007878} .badge.dark{background:var(--dark);color:#fff} +.btn{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);background:var(--white);color:var(--dark);border-radius:8px;padding:6px 12px;font-weight:700;cursor:pointer;text-decoration:none;font-size:12.5px;white-space:nowrap} +.btn:hover{border-color:var(--dark)} .btn.primary{background:var(--dark);color:#fff;border-color:var(--dark)} +.btn.cyan{background:var(--cyan);border-color:var(--cyan);color:#002b2b} .btn.cyan:hover{background:var(--cyan-d);border-color:var(--cyan-d);color:#fff} +.btn.danger{color:var(--err)} .btn.danger:hover{border-color:var(--err)} .btn.sm{padding:3px 9px;font-size:11.5px;border-radius:6px} +.btn[disabled],.btn.disabled{opacity:.45;pointer-events:none} +.seg{display:inline-flex;background:var(--stone);border-radius:8px;padding:2px;gap:1px} +.seg button{border:0;background:none;padding:4px 10px;border-radius:6px;font-weight:700;color:var(--mid);cursor:pointer;font-size:12px} +.seg button.on{background:var(--white);color:var(--dark);box-shadow:0 1px 2px rgba(0,0,0,.14)} +.chipbar{display:flex;gap:5px;flex-wrap:wrap} +.fchip{border:1px solid var(--border);background:var(--white);border-radius:999px;padding:3px 11px;font-size:12px;font-weight:700;color:var(--mid);cursor:pointer} +.fchip.on{background:var(--dark);color:#fff;border-color:var(--dark)} +input.search{border:1px solid var(--border);border-radius:8px;padding:6px 10px;min-width:220px;background:#fff} + +/* ── Tabellen ────────────────────────────────────────────── */ +table.t{width:100%;border-collapse:collapse} +table.t th{text-align:left;font-size:10.5px;font-weight:700;letter-spacing:1.2px;text-transform:uppercase;color:var(--gray);padding:6px 9px;border-bottom:1px solid var(--border);white-space:nowrap} +table.t td{padding:7px 9px;border-bottom:1px solid var(--stone);vertical-align:middle} +table.t tr:last-child td{border-bottom:0} +table.t.hover tbody tr{cursor:pointer} table.t.hover tbody tr:hover td{background:var(--mist)} +.logo-box{width:34px;height:34px;border:1px solid var(--border);border-radius:7px;background:var(--mist);display:grid;place-items:center;flex:none;overflow:hidden} +.logo-box img{max-width:28px;max-height:28px} +.logo-box.lg{width:120px;height:56px} .logo-box.lg img{max-width:104px;max-height:44px} +.swatches{display:inline-flex;gap:2px;vertical-align:middle} +.swatches i{width:12px;height:12px;border-radius:3px;border:1px solid rgba(0,0,0,.14);display:block} +.dotc{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:5px;background:var(--stone)} +.dotc.ok{background:var(--ok)} .dotc.warn{background:var(--warn)} .dotc.err{background:var(--err)} .dotc.cyan{background:var(--cyan)} + +/* ── Tenant-Seite ────────────────────────────────────────── */ +.thead{padding:12px 20px 10px;display:flex;gap:12px;align-items:center;flex-wrap:wrap;border-bottom:1px solid var(--border);background:var(--creme);position:sticky;top:0;z-index:6} +.thead h1{font-size:17px;letter-spacing:-.2px;line-height:1.2} +.crumb{font-size:11px;color:var(--gray)} .crumb a{text-decoration:none} .crumb a:hover{color:var(--dark)} +.dirty{display:inline-flex;gap:6px;align-items:center;font-size:11.5px;font-weight:700;color:#8a6200;background:#fbf0cf;border-radius:999px;padding:2px 10px} +.dirty::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--warn)} +.mid{min-width:0} +.tl{display:grid;grid-template-columns:176px minmax(0,1fr);flex:1;min-height:0;align-items:start} +.tl.open{grid-template-columns:176px minmax(340px,5fr) minmax(360px,6fr)} +.snav{position:sticky;top:53px;padding:12px 8px 20px 14px;display:flex;flex-direction:column;gap:1px;max-height:calc(100vh - 53px);overflow:auto} +.snav h6{margin:12px 8px 3px;font-size:9.5px;letter-spacing:1.6px;text-transform:uppercase;color:var(--gray)} +.snav h6:first-child{margin-top:0} +.snav button{display:flex;align-items:center;gap:7px;border:0;background:none;text-align:left;padding:6px 9px;border-radius:7px;font-weight:600;color:var(--mid);cursor:pointer;width:100%} +.snav button:hover{background:var(--stone);color:var(--dark)} .snav button.on{background:var(--white);color:var(--dark);box-shadow:0 1px 3px rgba(0,0,0,.1),inset 3px 0 0 var(--cyan)} +.snav .n{margin-left:auto;font-size:10.5px} +.pane{padding:14px 18px 60px;min-width:0;container-type:inline-size} +@container (max-width:780px){.grid2{grid-template-columns:1fr}.fgrid.c3{grid-template-columns:1fr 1fr}} +.panel{position:sticky;top:53px;height:calc(100vh - 53px);padding:10px 20px 14px 4px;display:none;flex-direction:column;gap:8px;min-width:0} +.tl.open .panel{display:flex} +.pbar{display:flex;gap:6px;align-items:center;flex-wrap:wrap} +.pv-frame{flex:1;background:var(--white);border:1px solid var(--border);border-radius:10px;position:relative;overflow:hidden;display:flex;justify-content:center;background-image:radial-gradient(#e6e1d8 1px,transparent 1px);background-size:14px 14px} +.pv-frame iframe{border:0;background:#fff;height:100%;width:100%;transition:width .2s;box-shadow:0 0 0 1px var(--border)} +.pv-frame.tablet iframe{width:768px;max-width:100%} .pv-frame.mobile iframe{width:390px;max-width:100%} +.pv-load{position:absolute;inset:0;background:rgba(244,239,232,.72);display:none;place-items:center;font-weight:700;color:var(--mid)} .pv-load.on{display:grid} +.pv-err{position:absolute;inset:0;background:#fff;padding:16px;overflow:auto;display:none;color:var(--err);font-family:var(--mono);font-size:12px;white-space:pre-wrap} .pv-err.on{display:block} +.hide{display:none!important} + +/* ── Formulare ───────────────────────────────────────────── */ +.fgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 12px} .fgrid.c3{grid-template-columns:repeat(3,minmax(0,1fr))} +.fgrid .full{grid-column:1/-1} +label.f{display:block;font-size:10.5px;font-weight:700;letter-spacing:.9px;text-transform:uppercase;color:var(--gray)} +label.f > input,label.f > select,label.f > textarea{display:block;width:100%;margin-top:3px;text-transform:none;letter-spacing:0;font-weight:400;color:#222} +input[type=text],input[type=email],input[type=url],input[type=password],input[type=number],select,textarea{border:1px solid var(--border);border-radius:7px;padding:5px 9px;background:#fff;outline:none;font-size:12.5px} +input:focus,select:focus,textarea:focus{border-color:var(--cyan);box-shadow:0 0 0 3px rgba(0,204,204,.16)} +textarea{width:100%;resize:vertical;line-height:1.5} +textarea.code{font-family:var(--mono);font-size:12px;tab-size:4;min-height:300px;background:#fbfaf8;white-space:pre} +.colors{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 14px} +.colorf{display:flex;gap:7px;align-items:center;min-width:0} +.colorf input[type=color]{width:24px;height:24px;border:1px solid var(--border);border-radius:5px;padding:0;background:none;cursor:pointer;flex:none} +.colorf span{font-size:11px;color:var(--mid);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.colorf input[type=text]{width:74px;padding:2px 5px;font-family:var(--mono);font-size:11.5px} +.chk{display:flex;gap:8px;align-items:flex-start;padding:5px 0}.chk input{margin-top:2px;accent-color:var(--dark)} +.hint{font-size:11.5px;color:var(--gray)} +.banner{border-radius:8px;padding:7px 12px;font-size:12.5px;margin-bottom:10px;border:1px solid} +.banner.warn{background:#fdf6df;border-color:#ecd48a;color:#6f5200} .banner.info{background:#e6f8f8;border-color:#a8e6e6;color:#005e5e} +.banner.err{background:#fbe6e3;border-color:#efb5ad;color:#8e2418} .banner.ok{background:#e8f5e8;border-color:#b3dcb3;color:#1e661e} +details.fold{border:1px solid var(--border);border-radius:9px;background:var(--white);margin-top:10px} +details.fold > summary{cursor:pointer;padding:8px 13px;font-weight:700;list-style:none;display:flex;gap:8px;align-items:center} +details.fold > summary::before{content:"▸";color:var(--gray);transition:.15s} details.fold[open] > summary::before{transform:rotate(90deg)} +details.fold > .in{padding:2px 14px 13px} +.kv{display:grid;grid-template-columns:104px 1fr;gap:5px 10px;font-size:12.5px} .kv dt{color:var(--gray);font-weight:700;font-size:10.5px;letter-spacing:.9px;text-transform:uppercase;padding-top:2px} .kv dd{margin:0} +.check{display:flex;gap:8px;padding:4px 0;align-items:center;font-size:12.5px} +.dot{width:17px;height:17px;border-radius:50%;display:grid;place-items:center;font-size:10px;font-weight:700;flex:none;background:var(--stone);color:var(--gray)} +.dot.ok{background:var(--ok);color:#fff} .dot.no{background:#f2d9d5;color:var(--err)} +.console{background:#141414;color:#d6f5e6;font-family:var(--mono);font-size:12px;border-radius:8px;padding:11px 13px;white-space:pre-wrap;min-height:90px;max-height:340px;overflow:auto} +.console .sim{color:#7fd8d8} +pre.json{background:#141414;color:#e6e6e6;border-radius:8px;padding:11px;font-size:11.5px;overflow:auto;max-height:300px;font-family:var(--mono);margin:6px 0 0} +.diff{font-family:var(--mono);font-size:11.5px;background:#fbfaf8;border:1px solid var(--border);border-radius:7px;overflow:auto;max-height:260px;margin:5px 0 10px} +.diff div{padding:0 9px;white-space:pre} .diff .a{background:#e3f6e3;color:#1c5a1c} .diff .r{background:#fbe3df;color:#8e2418} .diff .h{color:var(--gray);background:var(--stone)} +.empty{padding:22px;text-align:center;color:var(--gray)} +.copy{cursor:pointer;border-bottom:1px dashed var(--gray)} + +/* ── Agent-Chat ──────────────────────────────────────────── */ +.chat{display:flex;flex-direction:column;flex:1;min-height:0} +.agpane{position:sticky;top:53px;height:calc(100vh - 53px);padding:12px 12px 14px 18px} +.agpane.hide{display:none!important} +.msgs{flex:1;overflow:auto;display:flex;flex-direction:column;gap:9px;padding:2px 2px 10px} +.bub{max-width:94%;padding:8px 12px;border-radius:12px;white-space:pre-wrap;font-size:12.5px} +.bub.user{align-self:flex-end;background:var(--dark);color:#fff;border-bottom-right-radius:3px} +.bub.assistant{align-self:flex-start;background:var(--white);border:1px solid var(--border);border-bottom-left-radius:3px} +.steps{display:flex;flex-direction:column;gap:3px;margin:0 0 6px} +.step{display:flex;gap:6px;align-items:baseline;font-size:11.5px;color:var(--mid);background:var(--mist);border:1px solid var(--stone);border-radius:6px;padding:2px 8px;white-space:normal;overflow-wrap:anywhere} +.step b{font-family:var(--mono);color:#007878;flex:none} .step.err{background:#fbe6e3;border-color:#efb5ad} .step.err b{color:var(--err)} +.thought{color:var(--gray);font-style:italic;font-size:12px;margin:0 0 5px} +.prop{margin-top:8px;border:1px dashed var(--cyan);border-radius:8px;padding:8px 10px;background:#f0fbfb} +.chat-in{display:flex;gap:6px;border-top:1px solid var(--border);padding-top:8px} +.chat-in textarea{min-height:38px;max-height:120px} +.chips{display:flex;gap:5px;flex-wrap:wrap;margin-bottom:7px} +.chip{border:1px solid var(--border);background:var(--white);border-radius:999px;padding:2px 10px;font-size:11.5px;cursor:pointer}.chip:hover{border-color:var(--cyan)} +.typing{align-self:flex-start;color:var(--gray);font-size:11.5px} + +/* ── Modal / Toast ───────────────────────────────────────── */ +.modal-bg{position:fixed;inset:0;background:rgba(20,20,20,.5);display:none;place-items:center;z-index:50;padding:20px}.modal-bg.on{display:grid} +.modal{background:var(--creme);border-radius:12px;width:min(780px,100%);max-height:90vh;overflow:auto;padding:20px 22px;border:1px solid var(--border);box-shadow:0 20px 60px rgba(0,0,0,.35)} +.modal h2{font-size:17px;margin-bottom:10px}.modal .acts{display:flex;gap:8px;justify-content:flex-end;margin-top:14px} +#toast{position:fixed;bottom:18px;right:18px;background:var(--dark);color:#fff;padding:9px 15px;border-radius:9px;font-weight:700;z-index:99;display:none;border-left:4px solid var(--cyan);max-width:420px}#toast.err{border-color:var(--err)} + +@media (max-width:1250px){.grid2{grid-template-columns:1fr}.tl.open{grid-template-columns:150px minmax(300px,1fr) minmax(320px,1fr)}} +@media (max-width:800px){.side{width:56px}.side .brand span,.nav a span,.side-foot{display:none}.tl,.tl.open{grid-template-columns:1fr}.snav{position:static;flex-direction:row;flex-wrap:wrap;max-height:none}.snav h6{display:none}} diff --git a/app/static/tenant.js b/app/static/tenant.js new file mode 100644 index 0000000..9362188 --- /dev/null +++ b/app/static/tenant.js @@ -0,0 +1,598 @@ +/* Tenant-Detailseite: eine Navigation (links) · Formular (Mitte) · Vorschau/Agent (rechts) */ +let S = null; +let SCHEMA = null; +const ui = {sec: 'overview', mode: 'edit', open: true, pvKind: 'web', pvSrc: 'draft', pvDev: '', agentSrc: null}; +const SECTIONS = [ + ['overview', 'Übersicht', null, false], + ['brand', 'Marke & Farben', 'Gestaltung', true], ['texts', 'Absender & PDF-Texte', 'Gestaltung', true], ['pdf', 'PDF-Layout', 'Gestaltung', true], + ['prompt', 'Prompt', 'Inhalt', true], ['files', 'Dateien', 'Inhalt', true], + ['func', 'Funktion & STT', 'Verhalten', true], ['code', 'Hook-Code', 'Verhalten', true], ['adv', 'tenant.json', 'Verhalten', true], + ['domain', 'Domain & Login', 'Betrieb', false], ['secrets', 'Secrets', 'Betrieb', false], ['deploy', 'Deploy', 'Betrieb', false], ['versions', 'Verlauf', 'Betrieb', false], +]; +const A = p => `/api/tenants/${TID}${p}`; +const $ = s => document.querySelector(s); +const getPath = (o, p) => p.split('.').reduce((a, k) => (a == null ? a : a[k]), o); +function setPath(o, p, v){ const ks = p.split('.'); let c = o; ks.slice(0,-1).forEach(k => c = (c[k] ??= {})); c[ks.at(-1)] = v; } +function unsetPath(o, p){ const ks = p.split('.'); const chain = [o]; let c = o; for(const k of ks.slice(0,-1)){ c = c?.[k]; if(c == null) return; chain.push(c); } delete c[ks.at(-1)]; for(let i = ks.length - 2; i >= 0; i--){ if(Object.keys(chain[i+1]).length === 0) delete chain[i][ks[i]]; else break; } } +function debounce(fn, ms){ let t; return (...a) => { clearTimeout(t); t = setTimeout(() => fn(...a), ms); }; } +function shade(hex, f){ const n=parseInt(hex.slice(1),16); const c=[n>>16,(n>>8)&255,n&255].map(x=>Math.max(0,Math.min(255,Math.round(x*f)))); return '#'+c.map(x=>x.toString(16).padStart(2,'0')).join('').toUpperCase(); } +function tint(hex, a){ const n=parseInt(hex.slice(1),16); const c=[n>>16,(n>>8)&255,n&255].map(x=>Math.round(x+(255-x)*a)); return '#'+c.map(x=>x.toString(16).padStart(2,'0')).join('').toUpperCase(); } +const copyText = t => navigator.clipboard.writeText(t).then(()=>toast('Kopiert')); +const secDef = k => SECTIONS.find(s => s[0] === k); +const kindLabel = {'dry-run':'Dry-Run','deploy':'Deploy','offboard-dry':'Offboard (Dry-Run)','offboard':'Offboard'}; + +/* ───────── Laden & Rahmen ───────── */ +async function loadSchema(){ try{ const c = await api('GET', '/api/contract'); SCHEMA = c.schema; }catch(e){ SCHEMA = null; } } +async function load(keep){ + S = await api('GET', A('/state')); + renderHead(); renderNav(); + if(!keep) route(); +} +function route(){ + const h = (location.hash||'').slice(1); + if(secDef(h)) ui.sec = h; + renderSection(); +} +window.addEventListener('hashchange', route); + +function renderHead(){ + $('#h-name').textContent = S.name; + const st = S.status !== 'active' ? `${S.status}` : ''; + $('#h-badges').innerHTML = `${S.has_draft?'Entwurf':''}${st}v${S.current_version} + deployt v${S.deployed_version??'–'} + Quelle: ${S.source==='admin'?'Admin':'Git'}`; + $('#h-actions').innerHTML = S.has_draft + ? `` : ''; + document.querySelectorAll('#h-panel button').forEach(b => b.classList.toggle('on', b.dataset.p === ui.mode)); +} +function renderNav(extra){ + let g = null, out = ''; + const nfiles = Object.keys(S.files).length; + const badges = {files: nfiles ? `${nfiles}` : '', versions: `${S.current_version}`, + secrets: extra?.missing ? `` : '', code: S.files['overrides.py'] ? '' : '', + deploy: S.deployed_version !== S.current_version ? '' : ''}; + for(const [k, l, grp] of SECTIONS){ + if(grp !== g){ g = grp; if(grp) out += `
${grp}
`; } + out += ``; + } + $('#snav').innerHTML = out; +} +function gotoSec(k){ ui.mode = 'edit'; if(location.hash === '#'+k) route(); else location.hash = k; } +/* Layout: Mitte = Formular ODER Agent-Chat; die Live-Vorschau rechts bleibt in beiden Fällen sichtbar (Betriebsbereiche ohne Vorschau). */ +function layout(){ + ui.open = secDef(ui.sec)[3] || ui.mode === 'agent'; + $('#tl').classList.toggle('open', ui.open); + $('#pane').classList.toggle('hide', ui.mode === 'agent'); + $('#ag-wrap').classList.toggle('hide', ui.mode !== 'agent'); + document.querySelectorAll('#h-panel button').forEach(b => b.classList.toggle('on', b.dataset.p === ui.mode)); + if(ui.open) refreshPreview(); +} +$('#h-panel').addEventListener('click', e => { const b = e.target.closest('button'); if(!b) return; ui.mode = b.dataset.p; renderNav(); layout(); if(ui.mode === 'agent') $('#chat-text').focus(); }); +function renderSection(){ + renderNav(); layout(); + ({overview: sOverview, brand: sBrand, texts: sTexts, pdf: sPdf, prompt: sPrompt, files: sFiles, func: sFunc, code: sCode, adv: sAdv, + domain: sDomain, secrets: sSecrets, deploy: sDeploy, versions: sVersions})[ui.sec](); +} + +/* ───────── Speichern (Entwurf) ───────── */ +const saveState = txt => { const e = $('#save-ind'); if(e) e.textContent = txt; }; +function afterSave(r){ + S.has_draft = r.has_draft; renderHead(); saveState(r.has_draft ? 'Entwurf gespeichert' : 'Entspricht der veröffentlichten Version'); + refreshPreviewSoon(); +} +const saveConfigNow = async () => { try { saveState('Speichere …'); afterSave(await api('PUT', A('/config'), S.config)); } catch(e){ toast(e.message,1); saveState('Fehler'); } }; +const saveConfig = debounce(saveConfigNow, 500); +async function saveFileNow(path, content){ try { saveState('Speichere …'); afterSave(await api('PUT', A('/files/'+path), {content})); } catch(e){ toast(e.message,1); saveState(e.message); } } +const saveFile = debounce(saveFileNow, 600); +async function deleteFile(path){ afterSave(await api('DELETE', A('/files/'+path))); await load(true); renderSection(); } +async function uploadFile(input, path){ + const f = input.files[0]; if(!f) return; + const fd = new FormData(); fd.append('file', f); + const r = await fetch(A('/upload?path='+encodeURIComponent(path||f.name)), {method:'POST', body: fd}); + if(!r.ok){ toast((await r.json()).detail||'Upload fehlgeschlagen',1); return; } + await load(true); renderSection(); refreshPreviewSoon(); toast('Hochgeladen'); headLogo(); renderHead(); +} +function headLogo(){ const n = S.files['logo.svg']?'logo.svg':S.files['logo.png']?'logo.png':null; $('#h-logo').innerHTML = n?``:''; } +async function discardDraft(){ + if(!confirm('Alle Änderungen im Entwurf verwerfen?')) return; + await api('POST', A('/draft/discard')); await load(true); renderSection(); headLogo(); refreshPreview(true); toast('Entwurf verworfen'); +} +const saveInd = () => `${S.has_draft?'Entwurf vorhanden':'Entspricht der veröffentlichten Version'}`; +const title = (t, sub) => `

${t}${sub?` ${sub}`:''}

${saveInd()}
`; + +/* ───────── Live-Vorschau ───────── */ +let pvSeq = 0; +async function refreshPreview(force){ + if(!ui.open) return; + const seq = ++pvSeq, kind = ui.pvKind; + $('#f-web').style.display = kind==='web'?'':'none'; $('#f-pdf').style.display = kind==='pdf'?'':'none'; + $('#pv-frame').className = 'pv-frame ' + (kind==='web'?ui.pvDev:''); + $('#pv-dev').style.display = kind==='web'?'':'none'; + $('#pv-load').classList.add('on'); $('#pv-err').classList.remove('on'); + const t0 = performance.now(); + try { + const src = ui.pvSrc === 'agent' ? (ui.agentSrc || 'draft') : ui.pvSrc; + const r = await fetch(`/preview/${TID}/${kind}?source=${encodeURIComponent(src)}&_=${force?Date.now():''}`); + if(seq !== pvSeq) return; + if(!r.ok){ $('#pv-err').textContent = await r.text(); $('#pv-err').classList.add('on'); } + else if(kind==='web'){ $('#f-web').srcdoc = await r.text(); } + else { const b = await r.blob(); $('#f-pdf').src = URL.createObjectURL(b) + '#toolbar=0&navpanes=0'; } + $('#pv-info').textContent = `Core ${S.core_version} · ${Math.round(performance.now()-t0)} ms`; + } catch(e){ $('#pv-err').textContent = String(e); $('#pv-err').classList.add('on'); } + $('#pv-load').classList.remove('on'); +} +const refreshPreviewSoon = debounce(() => refreshPreview(), 900); +const refreshPreviewLive = debounce(() => refreshPreview(), 250); +function setPvSrc(src){ + ui.pvSrc = src; $('#pv-agent').classList.toggle('hide', !ui.agentSrc); + document.querySelectorAll('#pv-src button').forEach(x => x.classList.toggle('on', x.dataset.s === src)); +} +document.addEventListener('click', e => { + const b = e.target.closest('#pv-kind button, #pv-dev button, #pv-src button'); if(!b) return; + const g = b.parentElement.id; + b.parentElement.querySelectorAll('button').forEach(x => x.classList.toggle('on', x===b)); + if(g==='pv-kind') ui.pvKind = b.dataset.k; if(g==='pv-dev') ui.pvDev = b.dataset.d; if(g==='pv-src') ui.pvSrc = b.dataset.s; + refreshPreview(); +}); + +/* ───────── Übersicht ───────── */ +async function sOverview(){ + const c = S.config, col = c.colors||{}; + $('#pane').innerHTML = ` +
+

Status

+
+
URL
${esc(S.host)} ${S.domain_status==='verified'?'Domain ok':S.domain_status==='pending'?'DNS offen':'nicht eingerichtet'}
+
Version
v${S.current_version} veröffentlicht · v${S.deployed_version??'–'} deployt ${S.deployed_version!==S.current_version?'veraltet':''}
+
Quelle
${S.source==='admin'?'Admin (Bundle zur Laufzeit)':'Git – ins Image gebacken'}
+
Core
:${esc(String(S.core.tag).slice(0,12))} ${S.core.pin?'gepinnt':'folgt Rollouts'} · Admin-Vorschau: ${esc(S.core.sha)} +
+
STT
${esc((c.stt||{}).provider||'mistral')} ${esc((c.stt||{}).model||'')}
+
Dateien
${Object.keys(S.files).map(f=>`${esc(f)}`).join(' ')||'–'}
+
Marke
${Object.entries(col).map(([k,v])=>``).join('')}
+
+ +
+
+

Cut-over auf die Admin-Plattform

+

Bis alles grün ist, bleibt der Tenant auf Git. Umschalten = TENANT_SOURCE=admin beim nächsten Deploy.

+
Prüfe …
+
+
+
+

Betrieb

+
+ +
+
Ressourcen wirken beim nächsten Deploy. „paused/archived“ nimmt den Tenant aus „Alle neu deployen“.
+
+

Notizen

+ +
+
+
+

Core-Version

Neue Core-Releases rollt die Admin-Plattform zentral aus (Menü „Core“). Ein Pin hält diesen Tenant auf einem festen Tag – er nimmt dann an Rollouts nicht teil.

+
+
Gefahrenbereich
+

Offboard entfernt Service, Volume und Ingress aus dem Mittwald-Stack (Dry-Run zeigt vorher, was passiert). Löschen entfernt nur die Daten in dieser Datenbank – und nur für archivierte Tenants.

+
+
`; + const [cut, mode, sec] = await Promise.all([api('GET', A('/cutover')), api('GET', '/api/deploy/mode'), api('GET', A('/secrets'))]); + renderNav({missing: sec.some(s => s.required && !s.set)}); + $('#b-off')?.classList.toggle('disabled', !mode.live); + const ok = cut.checks.every(x=>x.ok); + $('#cut').innerHTML = cut.checks.map(x=>`
${x.ok?'✓':'!'}${esc(x.label)}
`).join('') + + `
${cut.source==='admin' + ? `Quelle: Admin` + : `${ok?'':'noch nicht alle Bedingungen erfüllt'}`}
`; +} +async function savePin(){ try{ await api('PUT', A('/core-pin'), {pin: $('#m-pin').value}); await load(true); toast('Core-Pin gespeichert – wirksam beim nächsten Deploy'); sOverview(); }catch(e){ toast(e.message,1) } } +async function probeMe(){ + $('#run-state').innerHTML = 'prüfe …'; + try{ const r = (await api('GET', '/api/status?refresh=1'))[TID]; $('#run-state').innerHTML = !r ? '' : r.reachable && !r.drift.length ? `läuft: Core ${esc((r.core?.version||'?').slice(0,10))}${r.bundle?.source==='admin'?' · Bundle v'+r.bundle.version:''}` : `${esc(r.drift.join(' · ')||'nicht erreichbar')}`; } + catch(e){ $('#run-state').innerHTML = `${esc(e.message)}`; } +} +async function saveMeta(){ try{ await api('PUT', A('/meta'), {cpu:$('#m-cpu').value, memory:$('#m-mem').value, status:$('#m-status').value, notes:$('#m-notes').value}); await load(true); toast('Gespeichert'); sOverview(); }catch(e){ toast(e.message,1) } } +async function setSource(s){ await api('PUT', A('/source'), {source:s}); await load(true); sOverview(); toast('TENANT_SOURCE='+s+' – wirksam beim nächsten Deploy'); } +async function runValidate(){ $('#val').innerHTML='Validiere mit dem echten Core …'; $('#val').innerHTML = valHtml(await api('POST', A('/validate?source=current'))); } +const valHtml = r => ``; +async function offboard(dry){ + if(!dry && !confirm('Service, Volume und Ingress dieses Tenants wirklich vom Mittwald-Stack entfernen?')) return; + try{ const r = await api('POST', A('/offboard'), {dry_run:dry}); followDeploy(r.id, $('#con-off')); }catch(e){ toast(e.message,1) } +} +async function deleteOidcApp(){ + const id = prompt('OIDC-Client dieses Tenants im Login-System LÖSCHEN (nicht umkehrbar, beendet alle Logins der App). Zur Bestätigung die Tenant-ID eingeben:'); if(id===null) return; + try{ await api('DELETE', A(`/oidc/app?confirm=${encodeURIComponent(id)}`)); toast('OIDC-Client gelöscht'); await load(true); sOverview(); }catch(e){ toast(e.message,1) } +} +async function deleteTenant(){ + const id = prompt('Alle Daten dieses Tenants in der Datenbank löschen (Versionen, Secrets, Chat). Zur Bestätigung die ID eingeben:'); if(id===null) return; + try{ await api('DELETE', `/api/tenants/${TID}?confirm=${encodeURIComponent(id)}`); location.href='/'; }catch(e){ toast(e.message,1) } +} + +/* ───────── Formular-Helfer ───────── */ +function bindCfg(root){ + root.querySelectorAll('[data-cfg]').forEach(el => { + el.addEventListener('input', () => { + const p = el.dataset.cfg; + const v = el.type==='checkbox' ? el.checked : el.type==='number' ? (el.value === '' ? '' : Number(el.value)) : el.value; + if(v === '' && !['name'].includes(p) && !p.startsWith('office.') && !p.startsWith('colors.')) unsetPath(S.config, p); else setPath(S.config, p, v); + if(el.type==='color'){ const t = root.querySelector(`[data-cfg="${p}"][type=text]`); if(t) t.value = v; } + if(el.type==='text' && el.dataset.color){ const c = root.querySelector(`[data-cfg="${p}"][type=color]`); if(c && /^#[0-9a-f]{6}$/i.test(v)) c.value = v; } + saveConfig(); + }); + }); +} +const fld = (label, path, o={}) => ``; + +/* ───────── Gestaltung ───────── */ +function sBrand(){ + const col = S.config.colors||{}; + const logo = S.files['logo.svg']?'logo.svg':S.files['logo.png']?'logo.png':null; + $('#pane').innerHTML = title('Marke & Farben') + ` +

Name & Titel

${fld('Name','name')}${fld('Seitentitel (Browser-Tab)','title')}${fld('Beschreibung','description',{full:1})}
+

Logo & Favicon

+
${logo?``:'kein Logo'}
+ +
Word-Export braucht zusätzlich logo.png.
+
${S.files['favicon.svg']?``:'–'}
+
+

Farben

+
${Object.keys(S.color_labels).map(k=>`
${esc(S.color_labels[k])}
`).join('')}
`; + bindCfg($('#pane')); +} +function deriveFromAccent(){ + const a = (S.config.colors||{}).accent; if(!/^#[0-9a-f]{6}$/i.test(a)) return toast('Akzent muss #RRGGBB sein',1); + Object.assign(S.config.colors, {accent_dark:shade(a,.72), accent_mid:shade(a,1.12), accent_light:tint(a,.88), accent_xlight:tint(a,.94)}); + saveConfigNow(); sBrand(); +} +function sTexts(){ + $('#pane').innerHTML = title('Absender & PDF-Texte') + ` +

Absender / Kopf- & Fußzeile

Erscheint im PDF und im Word-Export.

+ ${fld('Name','office.name')}${fld('Zusatz (Rechtsform)','office.subtitle')}${fld('Adresse','office.address',{full:1})}${fld('Telefon','office.tel')}${fld('E-Mail','office.email')}${fld('Website','office.website',{full:1})}
+

PDF-Beschriftungen

${fld('Bezeichnung „Projekt“ (z. B. „Thema“)','pdf_projekt_label',{ph:'Projekt'})}${fld('Fußzeilen-Hinweis','pdf_footer_note',{ph:'Standard des Cores'})}
`; + bindCfg($('#pane')); +} + +/* Text-Datei-Editor mit „Standard des Cores“ */ +async function fileEditor(path, o){ + const has = !!S.files[path]; let body = ''; + try { const r = await fetch(A('/files/'+path)+'?source=draft'); if(r.ok) body = await r.text(); } catch(e){} + const w = document.createElement('div'); w.className = 'card'; + w.innerHTML = `

${esc(o.title)}

+ ${has ? `eigene Datei` : `Core-Standard`}
+ ${o.sub?`

${o.sub}

`:''} + `; + const ta = w.querySelector('textarea'); + ta.addEventListener('input', () => saveFile(path, ta.value)); + ta.addEventListener('keydown', e => { if(e.key==='Tab'){ e.preventDefault(); ta.setRangeText(' ', ta.selectionStart, ta.selectionEnd, 'end'); ta.dispatchEvent(new Event('input')); } }); + w.querySelector('[data-act=custom]')?.addEventListener('click', async () => { await saveFileNow(path, body); await load(true); renderSection(); }); + w.querySelector('[data-act=reset]')?.addEventListener('click', async () => { if(confirm('Eigene Datei löschen und den Core-Standard verwenden?')) await deleteFile(path); }); + return w; +} +async function sPdf(){ + $('#pane').innerHTML = title('PDF-Layout') + `
+
Beispielprotokoll für die Vorschau
+
Format wie vom LLM geliefert; gilt nur für die Vorschau.
`; + $('#e1').appendChild(await fileEditor('protocol.html', {title:'protocol.html', sub:'Jinja-Template des PDFs.', h:300})); + $('#e2').appendChild(await fileEditor('protocol.css', {title:'protocol.css', sub:'Farben kommen als Jinja-Variablen aus der Marke.', h:300})); +} +async function saveSample(){ await api('PUT', A('/sample'), {sample: $('#sample').value}); S.sample = $('#sample').value; toast('Beispiel gespeichert'); ui.pvKind='pdf'; document.querySelectorAll('#pv-kind button').forEach(b=>b.classList.toggle('on',b.dataset.k==='pdf')); refreshPreview(true); } + +/* ───────── Inhalt ───────── */ +async function sPrompt(){ + $('#pane').innerHTML = title('Prompt') + ` +

Selbstbeschreibung

Ersetzt @@ORG@@ · @@ORG_SHORT@@ · @@ORG_PROFILE@@ im Standard-Prompt.

+ ${fld('Organisation (voll)','ai_detect_org')}${fld('Kurzname im Protokolltext','org_short')}${fld('Ein Satz: was die Organisation macht','org_profile',{full:1})}
+
Prompt testen (echter LLM-Lauf) kostet Cortecs-Guthaben
+ ${S.llm_ready ? '' : ''} +
+
+
+
`; + bindCfg($('#pane')); + $('#ed').appendChild(await fileEditor('prompt.txt', {title:'prompt.txt', sub:'Ohne eigene Datei gilt der Standard-Prompt des Cores. Hook-Code kann den Prompt zusätzlich erweitern (siehe „Finalen Prompt anzeigen“).', h:420})); +} +async function promptTest(){ + $('#pt-go').disabled = true; $('#pt-info').textContent = 'LLM läuft … (bis zu 1–2 Minuten)'; $('#pt-out').innerHTML = ''; + try{ + const r = await api('POST', A('/prompt-test'), {transcript:$('#pt-tr').value, terminart:$('#pt-art').value, projekt:$('#pt-proj').value}); + $('#pt-info').textContent = `${r.model} · ${r.input_tokens}→${r.output_tokens} Tokens · Prompt ${r.prompt_chars} Zeichen${r.truncated?' · ⚠ abgeschnitten (max_tokens)':''}`; + window._ptText = r.text; + $('#pt-out').innerHTML = `
${esc(r.text)}
`; + }catch(e){ $('#pt-info').textContent = ''; $('#pt-out').innerHTML = ``; } + $('#pt-go').disabled = !S.llm_ready; +} +async function usePtAsSample(){ await api('PUT', A('/sample'), {sample: window._ptText}); S.sample = window._ptText; ui.pvKind='pdf'; document.querySelectorAll('#pv-kind button').forEach(b=>b.classList.toggle('on',b.dataset.k==='pdf')); setPvSrc('draft'); refreshPreview(true); toast('Als Beispiel gesetzt'); } +async function showFinalPrompt(){ + try{ const r = await api('GET', A('/final-prompt')); $('#pt-out').innerHTML = `
${r.chars} Zeichen – so geht der Prompt (nach Platzhaltern und Hooks) an das LLM:
${esc(r.prompt)}
`; } + catch(e){ $('#pt-out').innerHTML = ``; } +} +function sFiles(){ + const rows = Object.entries(S.files).map(([p,m]) => `${esc(p)} ${m.personal?'personenbezogen':''}${(m.size/1024).toFixed(1)} KB${m.text?'Text':'Binär'}${m.text&&!['prompt.txt','protocol.html','protocol.css','overrides.py'].includes(p)?` `:''}`).join(''); + $('#pane').innerHTML = title('Dateien') + `
${rows||''}
PfadGrößeTyp
Keine Dateien
+
z. B. namensliste.txt – lesbar für Hook-Code im Container. Namenslisten sind für den KI-Agenten automatisch gesperrt.
`; +} +async function openTextFile(p){ const w = await fileEditor(p, {title:p, h:260}); $('#tf').innerHTML=''; $('#tf').appendChild(w); } + +/* ───────── Verhalten ───────── */ +/* Felder, die der Core im Schema deklariert, aber keine eigene Maske haben, erscheinen automatisch hier (neue Core-Optionen ohne Admin-Änderung). */ +const BESPOKE_PATHS = ['name','title','description','pdf_projekt_label','pdf_footer_note','ai_detect_org','org_short','org_profile']; +const isBespoke = p => BESPOKE_PATHS.includes(p) || p.startsWith('colors.') || p.startsWith('office.'); +function schemaField(f){ + const raw = getPath(S.config, f.path), cur = raw === undefined ? f.default : raw; + const help = f.help ? ` ${esc(f.help)}` : ''; + if(f.type === 'bool') return ``; + if(f.type === 'enum') return ``; + if(f.type === 'color') return ``; + if(f.type === 'text') return ``; + return ``; +} +function sFunc(){ + if(!SCHEMA) return sFuncLegacy(); + const groups = {}; + SCHEMA.fields.filter(f => !isBespoke(f.path)).forEach(f => (groups[f.group] ??= []).push(f)); + const order = Object.keys(groups); + const known = ['Funktion', 'Spracherkennung']; + const card = (g) => { const fs = groups[g], basic = fs.filter(f=>!f.advanced), adv = fs.filter(f=>f.advanced); + const grid = list => `
${list.map(schemaField).join('')}
`; + return `

${esc(g)}${known.includes(g)?'':' neu im Core'}

${basic.length?grid(basic):''}${adv.length?`
Erweitert
${grid(adv)}
`:''} + ${g==='Spracherkennung'?'

Bei „cortecs“ wird der geteilte CORTECS_API_KEY genutzt – ein eigener Mistral-Key ist nicht nötig.

':''}
`; }; + $('#pane').innerHTML = title('Funktion & STT') + `

Aus dem Schema des Cores (Version ${esc(S.core?.sha||'')}) erzeugt – neue Optionen erscheinen hier automatisch.

` + order.map(card).join(''); + bindCfg($('#pane')); +} +function sFuncLegacy(){ + const stt = S.config.stt||{}; + const chk = (path, label, hint, def) => { const v = getPath(S.config,path); return ``; }; + $('#pane').innerHTML = title('Funktion & STT') + ` +

Funktionen (Flags)

+ ${chk('flags.ui_kontakt_field','Feld „Ansprechpartner Kunde“','Aus: Feld in der Web-UI ausgeblendet (z. B. Vereine).',true)} + ${chk('flags.multi_audio','Mehrere Audiodateien (bis 5)','Aus: nur eine Datei pro Protokoll.',true)}
+

Spracherkennung (STT)

+ + ${fld('Modell','stt.model',{ph:'voxtral-mini-transcribe-2602'})}
`; + bindCfg($('#pane')); +} +async function sCode(){ + const has = !!S.files['overrides.py']; + $('#pane').innerHTML = title('Hook-Code') + ` +

Verfügbare Hooks

build_prompt
Prompt vor dem LLM-Aufruf anpassen
transform_transcript
Transkript nachbearbeiten
pdf_context
Daten fürs PDF-Template ändern
extra_routes
zusätzliche FastAPI-Routen
`; + if(has) $('#ed').appendChild(await fileEditor('overrides.py', {title:'overrides.py', sub:'Syntax wird beim Speichern geprüft.', h:460})); + else $('#ed').innerHTML = `
Dieser Tenant nutzt keinen Hook-Code.

`; +} +async function createHook(){ await saveFileNow('overrides.py', `"""Tenant-Hooks für ${S.id}."""\nfrom core.hooks import TenantHooks\n\n\nclass Hooks(TenantHooks):\n def build_prompt(self, base_prompt: str, ctx: dict) -> str:\n return base_prompt\n`); await load(true); renderSection(); } +function sAdv(){ + $('#pane').innerHTML = title('tenant.json') + `

Alle Felder, auch solche ohne Formular. Gültiges JSON wird automatisch übernommen. Der deploy-Block ist nicht Teil des Bundles (Domain/Ressourcen verwaltet die Plattform).

+
`; + $('#rawjson').addEventListener('input', e => { try { S.config = JSON.parse(e.target.value); $('#rawerr').textContent=''; saveConfig(); } catch(x){ $('#rawerr').textContent = 'Ungültiges JSON: '+x.message; } }); +} + +/* ───────── Veröffentlichen ───────── */ +async function openPublish(){ + modal('m-pub', true); $('#pub-body').innerHTML = '
Validiere (echter Core) und berechne Änderungen …
'; $('#pub-go').disabled = true; + const [val, diff] = await Promise.all([api('POST', A('/validate?source=draft')), api('GET', A('/diff?a=current&b=draft'))]); + const code = diff.items.some(i => i.path==='overrides.py'); + $('#pub-body').innerHTML = valHtml(val) + `

${diff.items.length} geänderte Datei(en)

` + diff.items.map(diffHtml).join('') + + (code ? `` : '') + + ``; + const upd = () => { $('#pub-go').disabled = !val.ok || (code && !$('#codeok').checked); }; + $('#codeok')?.addEventListener('change', upd); upd(); +} +const diffHtml = i => `
${esc(i.path)}${i.kind}${i.added!=null?`+${i.added} −${i.removed}`:''}
${i.diff?`
${i.diff.map(l=>`
${esc(l)||' '}
`).join('')}
`:'
Binärdatei
'}
`; +async function publish(){ + try { const r = await api('POST', A('/publish'), {message: $('#pubmsg').value}); modal('m-pub', false); await load(true); renderSection(); toast('Version v'+r.version+' veröffentlicht'); } + catch(e){ toast(e.message, 1); } +} + +/* ───────── Agent ───────── */ +const CHIPS = ['Setze die Akzentfarbe auf #0B6E4F','Füge dem Prompt hinzu: Nenne Beträge immer in Euro mit Tausenderpunkt.','Lege ein eigenes PDF-CSS an und mache die Überschriften größer.','Prüfe den Tenant auf Probleme.']; +async function initAgent(){ + $('#ag-chips').innerHTML = CHIPS.map(s=>`${esc(s)}`).join(''); + $('#chat-text').addEventListener('keydown', e => { if(e.key==='Enter' && !e.shiftKey){ e.preventDefault(); sendChat(); } }); + const st = await api('GET', '/api/llm/status?tenant=' + TID); + const src = {shared:'geteiltes Secret', env:'Env/.env', tenant:'Key des Tenants'}[st.source]; + $('#ag-mode').textContent = st.configured ? `${st.model} · ${st.api}` : 'Demo-Modus – kein Key gefunden'; + $('#ag-mode').className = 'badge ' + (st.configured ? 'cyan' : 'warn'); + $('#ag-mode').title = st.configured ? 'Cortecs-Key aus: ' + src : (st.error || 'Key unter Einstellungen → Geteilte Secrets setzen oder Env CORTECS_API_KEY'); + if(st.error) $('#ag-usage').textContent = '⚠ ' + st.error; + const h = await api('GET', A('/chat')); const box = $('#msgs'); + if(!h.length) box.innerHTML = '
Der Agent arbeitet auf einem Entwurf und schlägt Änderungen nur vor – du gibst sie frei.
'; + else h.forEach(m => box.appendChild(msgEl(m))); box.scrollTop = 1e9; +} +function stepsHtml(steps){ return (steps||[]).map(s=>`
${esc(s.tool)}${esc(s.arg)} → ${esc(s.result)}
`).join(''); } +function propHtml(m){ + if(!m.proposal) return ''; + const items = (m.proposal.items||[]).map(i=>`${esc(i.path)}`).join(' '); + return `
Vorschlag: ${esc(m.proposal.summary)}
${items}
${m.proposal_status==='open' + ? `` + : `${m.proposal_status==='applied'?'übernommen – prüfen & veröffentlichen':'verworfen'}`}
`; +} +function msgEl(m){ + const d = document.createElement('div'); d.className = 'bub '+m.role; d.id = 'm'+(m.id||''); + const u = m.usage && m.usage.in ? `
${esc(m.usage.model||'')} · ${m.usage.in}→${m.usage.out} Tokens
` : ''; + d.innerHTML = (m.steps&&m.steps.length?`
${stepsHtml(m.steps)}
`:'') + esc(m.content) + propHtml(m) + u; return d; +} +async function sendChat(text){ + const ta = $('#chat-text'); text = text || ta.value.trim(); if(!text) return; ta.value = ''; + ui.mode = 'agent'; layout(); + const box = $('#msgs'); box.querySelector('.empty')?.remove(); + box.appendChild(msgEl({role:'user', content:text})); + const live = document.createElement('div'); live.className = 'bub assistant'; live.innerHTML = '
Agent arbeitet …
'; box.appendChild(live); box.scrollTop = 1e9; + $('#chat-send').disabled = true; + try { + const r = await fetch(A('/chat'), {method:'POST', headers:{'Content-Type':'application/json'}, body: JSON.stringify({message:text})}); + if(!r.ok) throw new Error((await r.json()).detail || 'Fehler '+r.status); + const rd = r.body.getReader(), dec = new TextDecoder(); let buf = ''; + while(true){ + const {value, done} = await rd.read(); if(done) break; buf += dec.decode(value, {stream:true}); + let i; while((i = buf.indexOf('\n\n')) >= 0){ + const ev = JSON.parse(buf.slice(6, i)); buf = buf.slice(i+2); + if(ev.type==='mode'){ ui.agentSrc = 'ws:' + ev.run; $('#pv-agent').textContent = 'Agent-Stand (live)'; setPvSrc('agent'); } + else if(ev.type==='changed'){ refreshPreviewLive(); } + else if(ev.type==='step') live.querySelector('.steps').insertAdjacentHTML('beforeend', stepsHtml([ev])); + else if(ev.type==='thought') live.querySelector('.steps').insertAdjacentHTML('beforeend', `
${esc(ev.text)}
`); + else if(ev.type==='error') live.querySelector('.typing').textContent = '⚠ ' + ev.text; + else if(ev.type==='done'){ live.replaceWith(msgEl(ev.message)); + if(ev.message.proposal){ ui.agentSrc = 'proposal:' + ev.message.id; $('#pv-agent').textContent = 'Agent-Vorschlag'; setPvSrc('agent'); } else { ui.agentSrc = null; setPvSrc('draft'); } + refreshPreview(true); } + box.scrollTop = 1e9; + } + } + } catch(e){ live.remove(); toast(e.message, 1); } + $('#chat-send').disabled = false; +} +async function decide(id, d){ + const m = await api('POST', A(`/chat/${id}/${d}`)); $('#m'+id).replaceWith(msgEl(m)); + ui.agentSrc = null; setPvSrc('draft'); + if(d==='apply'){ await load(true); renderNav(); headLogo(); if(ui.sec==='overview') sOverview(); toast('Im Entwurf – Vorschau zeigt jetzt den Entwurf'); } + refreshPreview(true); +} +async function showProposalDiff(id){ const d = await api('GET', A(`/chat/${id}/diff`)); $('#diff-title').textContent = 'Vorschlag des Agenten'; $('#diff-body').innerHTML = d.items.length ? d.items.map(diffHtml).join('') : '
Keine Unterschiede zum Entwurf.
'; modal('m-diff', true); } +async function clearChat(){ if(!confirm('Chatverlauf dieses Tenants löschen?')) return; await api('DELETE', A('/chat')); $('#msgs').innerHTML = '
Verlauf geleert.
'; } + +/* ───────── Betrieb ───────── */ +async function sDomain(){ + const dnsTarget = `${S.subdomain}.${S.base_domain}`; + const o = await api('GET', A('/oidc')); window._oidc = o; + const logout = `https://${S.host}/`; + const modeHelp = {off:'Nichts im Login anfassen (Client wird manuell gepflegt).', adopt:'Bestehenden Client übernehmen: fehlende Redirect-URIs ergänzen, sonst nichts ändern.', managed:'Client vollständig aus dieser Konfiguration verwalten (anlegen, Redirect-URIs, auth/totp, Freigaben).'}; + $('#pane').innerHTML = `

Domain & Login

+
+

Domain

+
+
+
+ ${S.domain_status==='verified'?'verifiziert':S.domain_status==='pending'?'DNS ausstehend':'nicht eingerichtet'}
+
+ ${S.custom_domain?`
TypNameWert
CNAME${esc(S.custom_domain)}${esc(dnsTarget)}

Alternativ A-Record auf die Projekt-IP aus mStudio. TLS stellt Mittwald automatisch aus.

`:''} +

Redirect-URIs im Login ergeben sich aus Subdomain und eigener Domain und werden beim Deploy mit abgeglichen.

+ +

OIDC-Client · Abgleich über die Login-Developer-API bei jedem Deploy

+
+ API-Key ${o.api_key?'vorhanden':'fehlt'} + Schreiben ${o.writes_allowed?'erlaubt':'gesperrt'} + ${o.client_id?esc(o.client_id):'noch kein Client'} + Secret ${o.secret_set?'gesetzt':'fehlt'}
+
+ +
${modeHelp[o.mode]}
+ + + +
+
Redirect-URIs (Soll):
${o.redirect_uris.map(u=>`
${esc(u)}
`).join('')} +
Logout-Ziel: ${esc(logout)} (Core: OIDC_LOGOUT_REDIRECT_URI)
+
+ + +
+ ${o.last_sync?`
Letzter Abgleich: ${fmt(o.last_sync.ts)} · ${o.last_sync.ok?'✔ ok':'✘ '+esc(o.last_sync.error||'')}${o.last_sync.created?' · Client neu angelegt':''}
`:''} +
+ +
+

Freigaben

+
+

Wer darf die App nutzen (bei auth_mode „required“). Nutzer müssen im Login bereits existieren.

+
+
+
+

Manuell eintragen

Falls der Client nicht automatisch verwaltet wird (Verwaltung „off“) oder das Secret aus dem Altbestand übernommen werden soll.

+
+
+
+

Bundle-Abruf durch den Container

So holt der Container beim Start seine Konfiguration (ohne Secrets); Token = ADMIN_BUNDLE_TOKEN. Der Core kann das noch nicht – Schnittstelle steht.

+
curl -H "Authorization: Bearer $ADMIN_BUNDLE_TOKEN" \\\n  ${location.origin}/api/tenants/${TID}/bundle -o bundle.tar.gz
`; + renderMembers(o.members); + $('#oc-mode').addEventListener('change', e => { $('#oc-modehelp').textContent = modeHelp[e.target.value]; }); +} +function renderMembers(ms){ + window._members = ms.map(m => ({...m})); + $('#oc-members tbody').innerHTML = window._members.length ? window._members.map((m,i)=>` + + `).join('') : 'Keine Freigaben gepflegt – bestehende bleiben unverändert (Abgleich „nur ergänzen“).'; +} +function addMember(){ window._members.push({email:'', role:'viewer'}); renderMembers(window._members); } +async function saveOidc(toastOk){ + try{ + await api('PUT', A('/oidc'), {mode:$('#oc-mode').value, auth_mode:$('#oc-auth').value, totp_mode:$('#oc-totp').value, allow_registration:$('#oc-reg').checked, + backchannel_logout_uri:$('#oc-bc').value, members:window._members.filter(m=>m.email), members_mode:$('#oc-mm').value}); + if(toastOk) { toast('OIDC-Konfiguration gespeichert'); sDomain(); } return true; + }catch(e){ toast(e.message,1); return false; } +} +async function syncOidc(apply, rotate){ + if(!await saveOidc(false)) return; + if(rotate && !confirm('Secret rotieren? Das alte Secret ist sofort ungültig – der Container braucht danach einen Deploy.')) return; + if(apply && !rotate && !confirm('Jetzt im Login-System schreiben (Client anlegen/anpassen, Freigaben setzen)?')) return; + $('#oc-out').innerHTML = 'Frage das Login-System …'; + try{ + const r = await api('POST', A('/oidc/sync'), {apply, rotate}); + const acts = r.actions.map(a=>`
• ${esc(a.detail)}
`).join('') || (r.skipped?`
${esc(r.skipped)}
`:'
✔ Alles abgeglichen – keine Änderungen nötig.
'); + $('#oc-out').innerHTML = ``; + if(apply){ const keep = $('#oc-out').innerHTML; await load(true); await sDomain(); $('#oc-out').innerHTML = keep; } + }catch(e){ $('#oc-out').innerHTML = ``; } +} +async function importMembers(){ try{ const o = await api('POST', A('/oidc/import-members')); renderMembers(o.members); toast(o.members.length+' Freigaben übernommen – speichern nicht vergessen'); }catch(e){ toast(e.message,1) } } +async function saveManual(){ const id=$('#o-id').value, sc=$('#o-sec').value; if(id) await api('PUT',A('/secrets/OIDC_CLIENT_ID'),{value:id}); if(sc) await api('PUT',A('/secrets/OIDC_CLIENT_SECRET'),{value:sc}); toast('Gespeichert'); sDomain(); } +async function saveDomain(){ try{ await api('PUT', A('/domain'), {subdomain:$('#d-sub').value, custom_domain:$('#d-cust').value}); await load(true); sDomain(); toast('Domain gespeichert'); }catch(e){ toast(e.message,1) } } +async function checkDomain(){ $('#dns-msg').textContent='Prüfe …'; const r = await api('POST', A('/domain/check')); await load(true); await sDomain(); $('#dns-msg').textContent = r.message; } +async function sSecrets(){ + const sec = await api('GET', A('/secrets')); renderNav({missing: sec.some(s=>s.required&&!s.set)}); + $('#pane').innerHTML = `

Secrets

Verschlüsselt in der Datenbank. Werte werden nie angezeigt und gelangen nie in Agent-Kontext oder Bundle – nur beim Deploy als Env an den Container.

+ ${sec.map(s=>` + + `).join('')}
SchlüsselStatusBedeutung
${esc(s.key)}${s.required?' Pflicht':''}${s.set?'gesetzt':s.source==='sops-import'?'noch in SOPS':'fehlt'}${esc(s.help)} ${['SESSION_SECRET','ADMIN_BUNDLE_TOKEN'].includes(s.key)?``:''}
+
Bestehende Tenants: python scripts/import_tenants.py --with-secrets liest SOPS und verschlüsselt neu.
`; +} +async function setSecret(k){ const v = prompt('Neuer Wert für '+k+':'); if(v===null) return; await api('PUT', A('/secrets/'+k), {value:v}); toast('Gespeichert'); sSecrets(); } +async function addSecret(){ const k = prompt('Name (z. B. MISTRAL_API_KEY):'); if(!k) return; await setSecret(k.trim().toUpperCase()); } +async function genSecret(k){ if(!confirm(k+' neu erzeugen? Der Container braucht danach einen Deploy.')) return; await api('PUT', A('/secrets/'+k), {generate:true}); toast('Neu erzeugt'); sSecrets(); } + +async function followDeploy(id, con){ + con.classList.remove('hide'); con.style.display = 'block'; + const tick = async () => { const d = await api('GET','/api/deployments/'+id); con.innerHTML = esc(d.log).replace(/\[DRY-RUN\]/g,'[DRY-RUN]'); con.scrollTop = 1e9; + if(d.status==='running'||d.status==='queued') setTimeout(tick,500); else { await load(true); if(ui.sec==='deploy') sDeploy(true); } }; + tick(); +} +async function sDeploy(keepConsole){ + const [plan, hist] = await Promise.all([api('GET', A('/plan')), api('GET', '/api/deployments')]); + const mine = hist.filter(d => d.tenant === TID); const m = plan.mode; + const old = keepConsole ? $('#con')?.innerHTML : null; + $('#pane').innerHTML = `

Deploy

+ ${m.live?``:''} +

Vorflug-Check · ist alles bereit für den Live-Deploy? (liest nur)

Noch nicht ausgeführt.
+

Geplanter Rollout

+
Service
${esc(plan.service)}
Image
${esc(plan.patch.image)}
Version
v${S.current_version} ${S.has_draft?'Entwurf wird nicht deployt':''}
Ingress
${esc(plan.ingress.host)} → ${esc(plan.ingress.target)}
+
Voraussetzungen
API-Token Projekt-ID ${S.source==='admin'?`Core-Bundle`:''} + OIDC: ${plan.oidc.mode}${plan.oidc.mode!=='off'&&!plan.oidc.key?' · API-Key fehlt':''}
+ ${plan.missing_secrets.length?``:''} +
Service-Definition (PATCH-Body, Secrets maskiert)
${esc(JSON.stringify(plan.patch,null,2))}
+
+
+

Verlauf

${mine.length?`${mine.map(d=>``).join('')}
ZeitArtVersionStatus
${fmt(d.created_at)}${kindLabel[d.kind]||d.kind} ${d.simulated?'Dry-Run':'live'}v${d.version}${d.status}
`:'
Noch keine Deployments für diesen Tenant.
'}
`; + if(old){ $('#con').classList.remove('hide'); $('#con').innerHTML = old; } +} +async function runPreflight(){ + $('#pf').innerHTML = 'Prüfe (liest Mittwald-Stack, Login-API, Rendering) …'; + try{ + const r = await api('GET', A('/preflight')); + const dot = {ok:'ok', fail:'no', warn:'no', info:''}; const ic = {ok:'✓', fail:'✕', warn:'!', info:'i'}; + $('#pf').innerHTML = ``+ + r.items.map(i=>`
${ic[i.level]}${esc(i.label)} ${esc(i.detail)}${i.fix?`
→ ${esc(i.fix)}
`:''}
`).join(''); + }catch(e){ $('#pf').innerHTML = ``; } +} +async function rollbackTenant(){ if(!confirm('Auf den vorherigen Core-Tag zurückrollen?')) return; try{ const r = await api('POST', A('/rollback')); toast('Rollback auf :'+String(r.tag).slice(0,10)+' gestartet'); followDeploy(r.id, $('#con')); }catch(e){ toast(e.message,1) } } +async function startDeploy(dry){ + if(!dry && !confirm('Tenant jetzt auf Mittwald deployen?')) return; + try{ const r = await api('POST', A('/deploy'), {dry_run:dry}); followDeploy(r.id, $('#con')); }catch(e){ toast(e.message,1) } +} + +/* ───────── Verlauf ───────── */ +async function sVersions(){ + const v = await api('GET', A('/versions')); + $('#pane').innerHTML = `

Verlauf

Jede Veröffentlichung ist ein unveränderlicher Snapshot. Wiederherstellen legt die alte Version als Entwurf an – nichts wird überschrieben.

+ ${v.map(x=>` + `).join('')}
VersionNachrichtAutorZeitDateien
v${x.number} ${x.current?'aktuell':''} ${x.deployed?'deployt':''}${esc(x.message)}${esc(x.author)}${fmt(x.created_at)}${x.files}${x.current?'':` `}
`; +} +async function showDiff(a,b,t){ const d = await api('GET', A(`/diff?a=${a}&b=${b}`)); $('#diff-title').textContent = 'Diff '+t; $('#diff-body').innerHTML = d.items.length ? d.items.map(diffHtml).join('') : '
Keine Unterschiede.
'; modal('m-diff', true); } +async function restoreV(n){ if(!confirm('v'+n+' als Entwurf wiederherstellen? Ein bestehender Entwurf wird ersetzt.')) return; await api('POST', A(`/versions/${n}/restore`)); await load(true); location.hash = 'brand'; renderSection(); toast('v'+n+' liegt jetzt im Entwurf'); } + +(async () => { await loadSchema(); await load(); initAgent(); })(); diff --git a/app/templates/audit.html b/app/templates/audit.html new file mode 100644 index 0000000..b6486ce --- /dev/null +++ b/app/templates/audit.html @@ -0,0 +1,13 @@ +{% extends "base.html" %} +{% block title %}Audit-Log · Onyscribe Admin{% endblock %} +{% block body %} +
+
Nachvollziehbarkeit

Audit-Log.

+

Wer hat wann was geändert, veröffentlicht oder deployt – inklusive Freigaben von Agent-Vorschlägen.

+
+ + {% for r in rows %} + {% else %}{% endfor %} +
ZeitWerAktionTenantDetail
{{ r.ts|dt }}{{ r.actor }}{{ r.action }}{{ r.tenant_id or '–' }}{{ r.detail }}
Noch keine Einträge.
+
+{% endblock %} diff --git a/app/templates/base.html b/app/templates/base.html new file mode 100644 index 0000000..983fa5d --- /dev/null +++ b/app/templates/base.html @@ -0,0 +1,44 @@ + + + + + +{% block title %}Onyscribe Admin{% endblock %} + + + + + +
{% block body %}{% endblock %}
+
+ +{% block scripts %}{% endblock %} + + diff --git a/app/templates/core.html b/app/templates/core.html new file mode 100644 index 0000000..0bc67fb --- /dev/null +++ b/app/templates/core.html @@ -0,0 +1,90 @@ +{% extends "base.html" %} +{% block title %}Core · Onyscribe Admin{% endblock %} +{% block body %} +
+
Zusammenspiel mit dem Core

Core-Releases.

+

Die Core-CI meldet neue Images hierher. Die Admin-Plattform prüft damit alle Tenants, gibt nach deiner Freigabe aus und rollt Canary-zuerst aus – mit Health-Check pro Tenant und Rollback.

+
+
+
+

Core der Admin-Plattform

+

Vorschau, Sandbox und Formulare nutzen genau diesen Core. Im Container ist das Admin-Image FROM das Core-Image gebaut – Schriften, Python-Pakete und WeasyPrint sind damit identisch zur Produktion.

+

Rollout-Regeln

+
+

Gepinnte Tenants (Tenant → Übersicht → Core-Version) nehmen nicht teil. Der Rollout bricht beim ersten Fehler ab; Echt-Rollouts brauchen DEPLOY_LIVE=true.

+
+

Releases

+
+ +{% endblock %} +{% block scripts %} +{% raw %}{% endraw %} +{% endblock %} diff --git a/app/templates/dashboard.html b/app/templates/dashboard.html new file mode 100644 index 0000000..584369f --- /dev/null +++ b/app/templates/dashboard.html @@ -0,0 +1,123 @@ +{% extends "base.html" %} +{% block title %}Tenants · Onyscribe Admin{% endblock %} +{% block body %} +
+
+
Übersicht

Tenants.

+
+ + + + +
+
+ +
+
{{ stats.tenants }}Tenants
+
{{ stats.admin }}Quelle Admin
+
{{ stats.outdated }}Deploy veraltet
+
{{ stats.drafts }}Entwürfe
+
{{ stats.secrets }}Secrets offen
+
:{{ tag }}Core {{ core }}
+
+ +
+
+ +
+ {% for k,l in [('all','Alle'),('draft','Entwurf'),('outdated','Deploy veraltet'),('secrets','Secrets offen'),('git','Git'),('admin','Admin'),('code','mit Hook-Code'),('paused','pausiert / archiviert')] %}{{ l }}{% endfor %} +
+
+ + {% for r in rows %} + + + + + + + + + + + {% endfor %} +
TenantVersionQuelleMarkeAnpassungenRessourcenLäuftHinweise
{% if r.logo %}{% endif %}
+
{{ r.t.name }}{% if r.t.status!='active' %} {{ r.t.status }}{% endif %}
{{ r.host }}
v{{ r.t.current_version }} + {{ 'deployt v'~(r.t.deployed_version or '–') if r.outdated else 'deployt' }}{{ 'Admin' if r.t.source=='admin' else 'Git' }}{% for k in ['accent','accent_dark','accent_light','bg','red'] %}{% endfor %}STT {{ r.stt }}{% if r.custom_prompt %} · Prompt{% endif %}{% if r.custom_pdf %} · PDF{% endif %}{% if r.has_code %} · Code{% endif %}{{ r.t.cpu }} CPU · {{ r.t.memory }}–{% if r.t.draft %}Entwurf {% endif %}{% if r.missing_secrets %}{{ r.missing_secrets }} Secret(s){% endif %}
+
Keine Tenants für diesen Filter.
+
+ +

Letzte Deployments · alle ansehen

+ {% if last %}{% for d in last %} + {% endfor %}
{{ d.created_at|dt }}{{ d.tenant_id or 'alle' }}{{ d.kind }}v{{ d.version }}{{ d.status }}
+ {% else %}
Noch keine Deployments.
{% endif %} +
+
+ + + + +{% endblock %} +{% block scripts %} + +{% endblock %} diff --git a/app/templates/deployments.html b/app/templates/deployments.html new file mode 100644 index 0000000..7f104a1 --- /dev/null +++ b/app/templates/deployments.html @@ -0,0 +1,31 @@ +{% extends "base.html" %} +{% block title %}Deployments · Onyscribe Admin{% endblock %} +{% block body %} +
+
+
Rollout

Deployments.

+

Differenzielles PATCH auf den Mittwald-Stack (nie PUT), Namensraum app-, Guard für fremde Container, Abbruch beim ersten Fehler.

+
+
+ {% if not deploy_live() %}{% endif %} +
Core-Image:{{ tag }} + Image-Tag und Registry unter Einstellungen. Nach dem Core-Umbau holen Tenants ihr Bundle zur Laufzeit – dann genügt ein Neustart statt Image-Build.
+

Verlauf

+
+{% endblock %} +{% block scripts %} + +{% endblock %} diff --git a/app/templates/settings.html b/app/templates/settings.html new file mode 100644 index 0000000..09d15e6 --- /dev/null +++ b/app/templates/settings.html @@ -0,0 +1,133 @@ +{% extends "base.html" %} +{% block title %}Einstellungen · Onyscribe Admin{% endblock %} +{% block body %} +
+
Plattform

Einstellungen.

+

Geteilte Werte für alle Tenants – bisher Gitea-„Variables“ und secrets/shared.enc.yaml.

+
+ +
+

Hosting & Deploy

+
+ + + + + + + +
+
+
{{ '✓' if mode.token else '!' }}MITTWALD_API_TOKEN {{ 'gesetzt (lesende Dry-Run-Aufrufe möglich)' if mode.token else 'nicht gesetzt (Dry-Run ohne Lesezugriff)' }}
+
{{ '✓' if mode.live else '–' }}DEPLOY_LIVE {{ 'true – echte Deployments erlaubt' if mode.live else 'nicht aktiv – Schreibzugriffe gesperrt' }}
+
{{ '✓' if mode.allowed != 'keiner' else '–' }}DEPLOY_ALLOWED_TENANTS = {{ mode.allowed }} – nur diese Tenants werden live angefasst (Mittwald, Login-API)
+ +
+
+ +

Login-API (OIDC-Clients automatisch verwalten)

+
{{ '✓' if oidc.api_key else '!' }}ONYVA_LOGIN_API_KEY {{ 'gesetzt' if oidc.api_key else 'nicht gesetzt – Abgleich beim Deploy nur als Hinweis (Dry-Run) bzw. Fehler (live)' }}
+
{{ '✓' if oidc.writes_allowed else '–' }}OIDC_SYNC_LIVE / DEPLOY_LIVE {{ 'aktiv – Schreiben im Login erlaubt' if oidc.writes_allowed else 'nicht aktiv – nur Lesen/Plan' }}
+
+
Liest GET /apps mit dem Key. Der Key liegt als Env der Admin-Plattform (wie ein Admin-Passwort), nie in der DB.
+
+ +

Login (OIDC) & Limits

+
+ + + + +
+ +
+ +

LLM & Transkription (Cortecs)

+
+ + + + + +
+

Geteilte Secrets

+ {% for k in ['CORTECS_API_KEY','SMTP_PASSWORD'] %} +
{{ k }} + {{ 'gesetzt' if shared.get(k) else 'extern (SOPS) – noch nicht übernommen' }} +
+ {% endfor %} +
+ +

KI-Agent (Admin-Chat)

+
{{ 'Cortecs-Key vorhanden – echter Agent' if llm_ready else 'kein Key – Demo-Modus' }}
+
+ + +
+ +
Liest GET /v1/models mit dem geteilten Key und markiert Modelle mit Tool-Unterstützung.
+
+
+ +

E-Mail (SMTP)

+
+
+

Kostenerfassung

+
+
+ +

Weitere Core-Einstellungen · aus dem Schema des Cores erzeugt, gelten für alle Tenants

+

Alles, was der Core als geteilte Einstellung deklariert und oben noch keine eigene Maske hat. Neue Core-Variablen erscheinen hier automatisch und gehen beim Deploy ins Container-Env. Leer = Standard des Cores.

+
Lade …
+ +

Rollout

+
+

Der aktive Tag ändert sich durch Core-Releases (Menü „Core“).

+ +

Core

+
Vendored Core
{{ core }}
Bedeutung
Live-Vorschau und Validierung führen genau diesen Stand aus (vendor/platform, aktualisieren mit scripts/sync_core.sh).
+
+
+
+{% endblock %} +{% block scripts %} + +{% endblock %} diff --git a/app/templates/tenant.html b/app/templates/tenant.html new file mode 100644 index 0000000..518665a --- /dev/null +++ b/app/templates/tenant.html @@ -0,0 +1,51 @@ +{% extends "base.html" %} +{% block title %}{{ t.name }} · Onyscribe Admin{% endblock %} +{% block body %} +
+ +
+
Tenants / {{ t.id }}
+

{{ t.name }}

+
+
+
+
+ +
+
+
+ +
+
Lade …
+
+
Agent
+
+
+
+
+
+ +
+ + + +{% endblock %} +{% block scripts %} + + +{% endblock %} diff --git a/app/templating.py b/app/templating.py new file mode 100644 index 0000000..aaf085a --- /dev/null +++ b/app/templating.py @@ -0,0 +1,32 @@ +from __future__ import annotations + +from datetime import datetime +from zoneinfo import ZoneInfo + +from fastapi.templating import Jinja2Templates + +from app.settings import APP_NAME, ROOT + +templates = Jinja2Templates(directory=str(ROOT / "app" / "templates")) +BERLIN = ZoneInfo("Europe/Berlin") + + +def dt(value: datetime | None, fmt: str = "%d.%m.%Y %H:%M") -> str: + if not value: + return "–" + if value.tzinfo is None: + from datetime import timezone + value = value.replace(tzinfo=timezone.utc) + return value.astimezone(BERLIN).strftime(fmt) + + +templates.env.filters["dt"] = dt +templates.env.globals["APP_NAME"] = APP_NAME + + +def _live() -> bool: + from app.services import deploy + return deploy.live_enabled() + + +templates.env.globals["deploy_live"] = _live diff --git a/docker-compose.override.yml b/docker-compose.override.yml new file mode 100644 index 0000000..f2c9e84 --- /dev/null +++ b/docker-compose.override.yml @@ -0,0 +1,6 @@ +# Nur lokal (docker compose lädt diese Datei automatisch dazu): Port auf dem Host veröffentlichen. +# Coolify nutzt sie nicht – dort läuft der Zugriff über den Proxy (Domain auf Service „admin“, Port 8300). +services: + admin: + ports: + - "${ADMIN_PORT:-8300}:8300" diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7e4c724 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,63 @@ +# Onyscribe Admin – Admin-Oberfläche + Postgres. Für Coolify (Docker-Compose-Ressource) und lokal. +# Pflicht-Env: POSTGRES_PASSWORD, SECRET_KEY +# SECRET_KEY erzeugen: python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" +# Backups: Volume `pgdata` (Postgres) sichern – darin liegt ALLES (Tenants, Versionen, verschlüsselte Secrets). +# ACHTUNG: SECRET_KEY ebenfalls sichern – ohne ihn sind die Secrets in der DB nicht entschlüsselbar. +services: + admin: + build: + context: . + # Standard: vendored Core (lokal). Produktion: ADMIN_DOCKERFILE=Dockerfile.fromcore + CORE_IMAGE=/transkript-platform: + dockerfile: ${ADMIN_DOCKERFILE:-Dockerfile} + args: + CORE_IMAGE: ${CORE_IMAGE:-scratch} + restart: unless-stopped + depends_on: + db: + condition: service_healthy + environment: + DATABASE_URL: postgresql+psycopg://onyscribe:${POSTGRES_PASSWORD:?POSTGRES_PASSWORD setzen}@db:5432/onyscribe + SECRET_KEY: ${SECRET_KEY:?SECRET_KEY setzen} + PORT: "8300" + # Login der Admin-Plattform (login.onyva.dev). Mit AUTH_ENABLED=true sind Client + Zugriffsregel Pflicht. + AUTH_ENABLED: ${AUTH_ENABLED:-false} + OIDC_ISSUER: ${OIDC_ISSUER:-https://login.onyva.dev} + OIDC_CLIENT_ID: ${OIDC_CLIENT_ID:-} + OIDC_CLIENT_SECRET: ${OIDC_CLIENT_SECRET:-} + OIDC_REDIRECT_URI: ${OIDC_REDIRECT_URI:-} + OIDC_LOGOUT_REDIRECT_URI: ${OIDC_LOGOUT_REDIRECT_URI:-} + APP_COOKIE_SECURE: ${APP_COOKIE_SECURE:-true} + ADMIN_ALLOWED_EMAILS: ${ADMIN_ALLOWED_EMAILS:-} + ADMIN_REQUIRED_ROLE: ${ADMIN_REQUIRED_ROLE:-} + # Deploys: ohne DEPLOY_LIVE=true nur Dry-Run. Token nur setzen, wenn lesende Dry-Run-Aufrufe gewünscht sind. + DEPLOY_LIVE: ${DEPLOY_LIVE:-false} + # Welche Tenants dürfen LIVE angefasst werden (Mittwald + Login-API)? leer = keiner · demo-admin,x = diese · * = alle + DEPLOY_ALLOWED_TENANTS: ${DEPLOY_ALLOWED_TENANTS:-} + MITTWALD_API_TOKEN: ${MITTWALD_API_TOKEN:-} + # Core-CI meldet neue Images hierher (POST /api/core/releases, Bearer-Token) + CORE_RELEASE_TOKEN: ${CORE_RELEASE_TOKEN:-} + # OIDC-Clients automatisch verwalten (Developer-API von login.onyva.dev). Key = Admin-Passwort-Äquivalent! + ONYVA_LOGIN_API_KEY: ${ONYVA_LOGIN_API_KEY:-} + OIDC_SYNC_LIVE: ${OIDC_SYNC_LIVE:-false} # true erlaubt Schreiben im Login-System (auch ohne DEPLOY_LIVE) + # Optional statt Eintrag unter Einstellungen → Geteilte Secrets + CORTECS_API_KEY: ${CORTECS_API_KEY:-} + expose: + - "8300" # Coolify: Domain auf Service „admin“ legen, Port 8300 (https://:8300). Lokal veröffentlicht docker-compose.override.yml den Port. + + db: + image: postgres:16-alpine + restart: unless-stopped + environment: + POSTGRES_USER: onyscribe + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:?POSTGRES_PASSWORD setzen} + POSTGRES_DB: onyscribe + volumes: + - pgdata:/var/lib/postgresql/data + healthcheck: + test: ["CMD-SHELL", "pg_isready -U onyscribe -d onyscribe"] + interval: 5s + timeout: 5s + retries: 10 + +volumes: + pgdata: diff --git a/docs/RUNBOOK_PARALLELTEST.md b/docs/RUNBOOK_PARALLELTEST.md new file mode 100644 index 0000000..48549ca --- /dev/null +++ b/docs/RUNBOOK_PARALLELTEST.md @@ -0,0 +1,289 @@ +# Runbook: Admin-Plattform parallel zum Altbetrieb testen (ohne Merge, nur mit Demo-Tenant) + +Ziel: Die neue Admin-Plattform und den neuen Core **parallel** zu den laufenden Tenants betreiben – mit **einem** neuen Test-Tenant +`demo-admin`. Nichts Bestehendes wird angefasst, es wird **nichts gemergt**, und jeder Schritt lässt sich einzeln zurücknehmen. + +--- + +## 0. So läuft das Ganze parallel (und warum der Altbetrieb sicher ist) + +``` +ALTBETRIEB (unverändert) NEUBETRIEB (Test) +──────────────────────── ───────────────── +Gitea: main / cortecs-llm-migration Gitea: Branch admin-platform-integration + └ build-deploy.yml → :latest + deploy-all └ build-branch-image.yml → NUR Image : (kein :latest, kein Deploy) +Mittwald: app-demo, app-rotary, app-sprinz, … Mittwald: app-demo-admin ← neuer, eigener Service + Volume + Ingress + Domain: demo. … Domain: demo-admin. + Daten: ins Image gebacken (tenants/) Daten: Bundle von der Admin-Plattform (TENANT_SOURCE=admin) + OIDC-Client: von Hand angelegt OIDC-Client: automatisch über die Login-API + Admin-Plattform auf Coolify (eigene Domain, eigene Postgres) +``` + +Schutzmechanismen (alle eingebaut und getestet): + +| Schutz | Wirkung | +|---|---| +| Branch-Trennung | `build-deploy.yml` läuft nur auf `main`/`cortecs-llm-migration` (auch nicht per „Run workflow“ vom Test-Branch). Der Test-Branch baut nur ein Image mit Tag = Git-SHA. | +| Eigener Tenant | `demo-admin` hat eigenen Service `app-demo-admin`, eigenes Volume `vol-demo-admin`, eigenen Host und eigenen OIDC-Client. `app-demo` bleibt unberührt. | +| `DEPLOY_ALLOWED_TENANTS=demo-admin` | Die Admin-Plattform darf **nur** diesen Tenant live anfassen (Mittwald **und** Login-API). Auch „Alle neu deployen“ trifft nur ihn. | +| `DEPLOY_LIVE=false` zum Start | Erst nur Dry-Run (liest den Stack, schreibt nichts). | +| Differenzielles PATCH + Guard | Es wird nur `app-demo-admin` geschrieben; danach prüft der Admin, dass alle fremden Services noch da sind. | +| Default `TENANT_SOURCE=git` im Core | Der neue Core verhält sich ohne Env wie der alte. | + +Rückgängig machen: siehe **Abschnitt 11**. + +--- + +## 1. Werte zusammentragen (einmalig) + +| Wert | Woher | Verwendung | +|---|---|---| +| `DOMAIN` | Gitea → Repo `transkriptipt-platform` → Einstellungen → Actions → **Variablen** | Basis-Domain in der Admin-Plattform | +| `PROJECT_ID`, `STACK_ID` | dito | Mittwald-Ziel | +| `REGISTRY` (z. B. `gitea.onyva.dev/onyva`) | dito | Registry in der Admin-Plattform | +| `MITTWALD_API_TOKEN` | Gitea → **Secrets** (du kennst den Wert; derselbe Token) | Env der Admin-Plattform | +| Weitere Variablen: `OIDC_ISSUER`, `AUTH_ENABLED`, `APP_COOKIE_SECURE`, `MAX_FILE_SIZE_MB`, `CORTECS_BASE_URL`, `LLM_MODEL`, `LLM_MAX_TOKENS`, `LLM_TEMPERATURE`, `SMTP_HOST/PORT/USER/FROM`, `MISTRAL_*`, `COST_*` | dito | in **Einstellungen** der Admin-Plattform (Abschnitt 6) | +| `CORTECS_API_KEY`, `SMTP_PASSWORD` | `cd ~/PycharmProjects/transkript-platform && sops -d --extract '["CORTECS_API_KEY"]' secrets/shared.enc.yaml` (analog `SMTP_PASSWORD`) | Einstellungen → Geteilte Secrets | +| `COST_INGEST_KEY` von `demo` | `sops -d --extract '["COST_INGEST_KEY"]' tenants/demo/secrets.enc.yaml` | Secret des Test-Tenants (Abschnitt 7, Punkt 7.4) | +| **``** | du wählst: Domain, unter der Coolify die Admin-Plattform ausliefert, z. B. `admin.deine-domain.de` | muss **öffentlich per HTTPS** erreichbar sein (der Tenant-Container holt von dort sein Bundle) | +| **``** | deine Login-E-Mail bei login.onyva.dev (Konto muss dort existieren) | Admin-Zugriff + Freigabe im Test-Tenant | + +Werte **nicht** in Chats oder Tickets kopieren (Keys, Secrets). + +--- + +## 2. Core-Branch pushen (Image bauen lassen) + +```bash +cd ~/PycharmProjects/transkript-platform +git branch --show-current # → admin-platform-integration +git log --oneline -3 # 13055b8 CI: build-deploy nur von Produktions-Branches … +git rev-parse HEAD # → voller SHA; z. B. 13055b811ca0030841f41ce1f10e4f30cba1a7db ← MERKEN (= CORE_SHA) +git push -u origin admin-platform-integration +``` + +Was jetzt in Gitea passiert (Repo → **Actions**): + +| Workflow | Erwartung | +|---|---| +| `test` | grün (Schema ↔ Code ↔ Tenants, Bundle-Loader) | +| `build-branch-image` | grün; Log-Zeile „Image gebaut: `/transkript-platform:`“ | +| `build-deploy` | **läuft nicht** (Branch nicht gelistet) – wenn doch: sofort abbrechen und melden | + +Prüfen: Gitea → Repo → **Packages** → `transkript-platform` hat einen neuen Tag = voller SHA. Der Tag `latest` ist **unverändert** (Zeitstempel!). + +> ✅ Ergebnis: `CORE_SHA` (voller 40-stelliger SHA). Lege ihn in deine Notizen. + +--- + +## 3. Admin-Plattform ins eigene Repo + +1. Gitea → **Neues Repository**: Organisation `Onyva`, Name `onyscribe-admin`, **privat**, leer (ohne README/.gitignore/Lizenz). +2. Lokal: + +```bash +cd ~/PycharmProjects/onyscribe-admin +git status --short | head # .env und .data dürfen NICHT erscheinen (sind ignoriert) +git ls-files | grep -E '(^|/)\.env$|\.db$' || echo "ok: keine Secrets/DB im Index" +git add -A +git commit -m "Onyscribe Admin: Initialer Stand" +git remote add origin https://gitea.onyva.dev/Onyva/onyscribe-admin.git +git push -u origin main +``` + +Hinweis: `seed/tenants.seed.json.gz` enthält die Tenant-Konfigurationen inkl. Zusatzdateien (z. B. `namensliste.txt` – personenbezogen). Das liegt heute schon im Altrepo; Repo privat halten. + +--- + +## 4. Login-System: Client + API-Key für die Admin-Plattform + +Im Login-Dashboard (login.onyva.dev), als Admin: + +1. **API-Keys → neuer Key** („onyscribe-admin“, ggf. Ablaufdatum). Klartext `onyva_…` **einmalig** kopieren → später `ONYVA_LOGIN_API_KEY`. +2. Client für die Admin-Plattform selbst anlegen (Dashboard **oder** per API): + +```bash +KEY=onyva_… # der Key aus 1. +curl -sX POST https://login.onyva.dev/api/v1/apps -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ + -d '{"name":"Onyscribe Admin","redirect_uris":["https:///auth/callback"],"auth_mode":"required","totp_mode":"disabled"}' +# → client_id + client_secret SOFORT sichern (nur einmal sichtbar) +curl -sX PUT https://login.onyva.dev/api/v1/apps//memberships -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ + -d '{"user_email":"","role":"admin"}' +``` + +Ergebnis: `client_id`, `client_secret` (Admin-Login), `ONYVA_LOGIN_API_KEY`. + +--- + +## 5. Coolify: Admin-Plattform deployen + +**Neue Ressource → Docker Compose (aus Git)**: Repo `Onyva/onyscribe-admin`, Branch `main`, Compose-Datei `docker-compose.yml` +(Zugriff auf das private Repo per Deploy-Key/Token einrichten). + +**Umgebungsvariablen** (Coolify → Ressource → Environment): + +| Variable | Wert | Phase | +|---|---|---| +| `POSTGRES_PASSWORD` | langes Zufallspasswort | immer | +| `SECRET_KEY` | `python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"` – **sichern! ohne ihn sind die Secrets in der DB unlesbar** | immer | +| `AUTH_ENABLED` | `true` | immer | +| `OIDC_ISSUER` | `https://login.onyva.dev` | immer | +| `OIDC_CLIENT_ID` / `OIDC_CLIENT_SECRET` | aus Abschnitt 4 (Punkt 2) | immer | +| `OIDC_REDIRECT_URI` | `https:///auth/callback` | immer | +| `OIDC_LOGOUT_REDIRECT_URI` | `https:///` | immer | +| `APP_COOKIE_SECURE` | `true` | immer | +| `ADMIN_ALLOWED_EMAILS` | `` (weitere kommagetrennt) | immer – ohne Regel wird jeder Login abgelehnt | +| `MITTWALD_API_TOKEN` | derselbe Token wie in Gitea | immer | +| `ONYVA_LOGIN_API_KEY` | aus Abschnitt 4 (Punkt 1) | immer | +| `DEPLOY_ALLOWED_TENANTS` | `demo-admin` | immer | +| `DEPLOY_LIVE` | **`false`** | Phase 1 (Dry-Run) → in Abschnitt 8 auf `true` | +| `OIDC_SYNC_LIVE` | `false` | optional `true`, um den Login-Abgleich separat vor dem Deploy zu testen | +| `CORE_RELEASE_TOKEN` | leer | erst in Abschnitt 10 | +| `CORTECS_API_KEY` | leer (wird in der UI als Secret gesetzt) | optional | + +**Domain**: Service `admin` → Domain `https://:8300` (Port 8300 = Container-Port). **Persistente Daten**: Volume `pgdata` (Postgres) – Backup einrichten. + +Deploy starten. Der erste Build nutzt das normale `Dockerfile` (mitgelieferter Core-Snapshot, **keine Registry nötig**). + +Prüfen: + +- [ ] `https:///healthz` → `{"ok":true}` +- [ ] `https:///` → Weiterleitung zu login.onyva.dev → Login → Dashboard mit **7 Tenants** (Seed). +- [ ] Seitenleiste unten: „Deploy: gesperrt · Dry-Run“, „“. +- Probleme: „Kein Zugriff“ → `ADMIN_ALLOWED_EMAILS`; `redirect_uri`-Fehler → Redirect-URI im Login-Client **exakt** wie in `OIDC_REDIRECT_URI`. + +--- + +## 6. Admin-Plattform konfigurieren (Menü „Einstellungen“) + +Felder (Spalte „Gitea“ = dieselbe Variable wie bisher), dann oben **„Alles speichern“**: + +| Feld in der Admin-Plattform | Wert / Gitea | +|---|---| +| Basis-Domain | `DOMAIN` | +| Mittwald PROJECT_ID / STACK_ID | `PROJECT_ID` / `STACK_ID` | +| Registry | `REGISTRY` | +| Image-Name | `transkript-platform` | +| **Öffentliche URL der Admin-Plattform** | `https://` | +| **Core kann Bundle laden** | ✔ aktivieren (betrifft nur Tenants mit Quelle „Admin“, also nur `demo-admin`) | +| Login (OIDC) & Limits | `OIDC_ISSUER`, `AUTH_ENABLED` (true), `APP_COOKIE_SECURE` (true), `MAX_FILE_SIZE_MB` | +| LLM & Transkription | `CORTECS_BASE_URL`, `LLM_MODEL`, `LLM_MAX_TOKENS`, `LLM_TEMPERATURE`, `MISTRAL_*` | +| E-Mail (SMTP) | `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_FROM` | +| Kostenerfassung | `COST_API_BASE`, `COST_TRACKING_ENABLED` | +| „Weitere Core-Einstellungen“ (aus dem Schema) | nur ausfüllen, was du in Gitea auch gesetzt hast (`COST_LLM_*`, `COST_STT_PER_MINUTE`, `STT_*` …); leer = Standard des Cores | +| Rollout → Canary-Tenants | `demo-admin` | +| Geteilte Secrets → `CORTECS_API_KEY` | **Wert setzen** (aus `sops -d …`) | +| Geteilte Secrets → `SMTP_PASSWORD` | **Wert setzen** (nur nötig, wenn der Test E-Mail-Versand prüfen soll) | + +Dann: Karte „Login-API“ → **„Verbindung testen“** → `✔ Verbindung ok – N App(s) im Login`. + +--- + +## 7. Test-Tenant `demo-admin` anlegen und konfigurieren + +**7.1 Anlegen**: Dashboard → **+ Neuer Tenant** → Name `Onyva Demo (Admin-Test)`, ID `demo-admin`, Ausgangspunkt „Kopie von Onyva Demo“ → Anlegen. +(Quelle ist automatisch „Admin“, OIDC-Verwaltung „managed“.) + +**7.2 Spracherkennung**: Tenant → *Funktion & STT* → Provider `cortecs`, Modell `voxtral-mini-transcribe-2602` +(dann reicht der geteilte Cortecs-Key; `demo` nutzt sonst Mistral und bräuchte einen eigenen `MISTRAL_API_KEY`). + +**7.3 Optisch unterscheidbar machen**: *Marke & Farben* → Akzent z. B. `#E8590C` → „Töne aus Akzent ableiten“. Oben rechts **Prüfen & veröffentlichen** → Nachricht „Test-Tenant“ → **v2**. + +**7.4 Secrets**: Tenant → *Secrets* → `COST_INGEST_KEY` **Wert setzen** (der Wert von `demo`; Kosten laufen dann unter `demo`, für den Test okay). +`SESSION_SECRET` und `ADMIN_BUNDLE_TOKEN` sind schon erzeugt. `OIDC_CLIENT_ID/SECRET` legt der Deploy automatisch an. + +**7.5 Login**: Tenant → *Domain & Login*: Subdomain `demo-admin`; OIDC-Verwaltung `managed`, Zugriff `required`; **Freigaben**: `` als `editor` (Nutzer muss im Login existieren) → *Speichern*. +**„Gegen Login prüfen“** (nur lesend) → erwartet: „würde App ‚Onyscribe – Onyva Demo (Admin-Test)‘ anlegen (Redirect: https://demo-admin./auth/callback …)“ und „würde als editor freigeben“. + +**7.6 Core pinnen**: Tenant → *Übersicht* → Karte „Core-Version“ → Pin = **voller SHA aus Abschnitt 2** → *Pin setzen*. +(Der Pin sorgt dafür, dass genau das Branch-Image läuft und der Health-Check die Core-Version prüfen kann.) + +**7.7 Vorflug-Check + Dry-Run**: Tenant → *Deploy* → **Vorflug-Check → Prüfen**. +Erwartet in Phase 1: alles grün/gelb, **gelb** nur „DEPLOY_LIVE nicht aktiv“; keine roten Punkte. Typische rote Punkte und Fix stehen direkt dabei +(z. B. Registry/PROJECT_ID/Token fehlen, `CORTECS_API_KEY`/`COST_INGEST_KEY` fehlen, „Core kann Bundle laden“ aus, Admin-URL nicht erreichbar). +Dann **Dry-Run** → Log lesen: „geschützte bestehende Services (bleiben unangetastet): [app-demo, app-rotary, …]“, `[DRY-RUN] PATCH …` für Volume und Service, kein Schreibzugriff. + +--- + +## 8. Live-Deploy des Test-Tenants + +1. Coolify → Admin-Ressource → `DEPLOY_LIVE=true` setzen (`DEPLOY_ALLOWED_TENANTS=demo-admin` bleibt) → neu deployen (Daten bleiben). +2. Admin → `demo-admin` → *Deploy* → Vorflug-Check → muss **„Bereit“** zeigen → **Deployen**. + +Was passiert (Log): OIDC-Client im Login anlegen und Secret speichern → Pflicht-Secrets prüfen → Volume + Service per PATCH → Service neu erzeugen → Ingress +`demo-admin.` → Health-Check (bis ~90 s Wartezeit für Start + Zertifikat). + +Abnahme-Checkliste: + +- [ ] Deploy-Log endet mit `Health-Check … ✔ · Core 13055b811c · Bundle v2` und `✔ Fertig` +- [ ] mStudio: Service `app-demo-admin` läuft; **alle anderen Services unverändert** (Image-Tags wie vorher) +- [ ] `https://demo-admin./health` → `core.version` = dein SHA, `bundle` = `{"source":"admin","version":2,"stale":false}` +- [ ] Seite öffnen → Login → freigegebener Nutzer kommt rein → Oberfläche in der **neuen Farbe** +- [ ] Protokoll erzeugen (kleines Transkript hochladen) → Zusammenfassung → PDF/Word → Aussehen = Vorschau in der Admin-Plattform +- [ ] Admin → Dashboard → **Zustand prüfen**: `demo-admin` grün. Die Altbetrieb-Tenants zeigen „Core ohne Vertrag (alte Version)“ – **erwartet und harmlos** (sie laufen noch auf dem alten Image) +- [ ] Altbetrieb: `demo.` und die anderen Kunden funktionieren unverändert + +--- + +## 9. Änderung ohne Core-Änderung testen + +1. Admin → `demo-admin` → *Marke & Farben*: Akzent ändern → **Prüfen & veröffentlichen** (v3) → *Deploy* → **Deployen** (nur Neustart, kein Image-Build). +2. Erwartung: Health-Check `Bundle v3 ✔`; Seite neu laden → neue Farbe. +3. Agent: *KI-Agent* → „Setze die Akzentfarbe auf #0B6E4F“ → Live-Vorschau beobachten → „In Entwurf übernehmen“ → veröffentlichen → deployen. +4. Ausfallsicherheit (nur `demo-admin`!): Coolify → Admin-Ressource **stoppen**; in mStudio den Container `app-demo-admin` **neu starten** → er startet mit gecachtem Bundle: + `https://demo-admin./health` → `bundle.source = "cache"`, `stale = true`. Admin wieder starten → nächster Container-Neustart holt wieder `admin`. + +--- + +## 10. (Optional) Den kompletten Core-Release-Weg testen + +1. Coolify: `CORE_RELEASE_TOKEN` = langes Zufallstoken, Admin neu deployen. Gitea → Repo → Einstellungen → Actions: **Variable** `ADMIN_URL` = `https://`, **Secret** `ADMIN_RELEASE_TOKEN` = dasselbe Token. + (Wirkt nur auf Workflows des Test-Branches; `main` kennt den `notify-admin`-Job nicht.) +2. Im Core-Repo eine Kleinigkeit committen und auf den Branch pushen → `build-branch-image` baut und meldet das Release. +3. Admin → Menü **Core**: neues Release, Badge **„Admin älter/anders“** (die Admin-Plattform enthält noch den alten Core-Snapshot). +4. Angleichen: `cd ~/PycharmProjects/onyscribe-admin && scripts/sync_core.sh && git add -A && git commit -m "Core-Snapshot aktualisiert" && git push` → Coolify deployt → Badge **„gleicher Core“**. + *(Später ersetzt `Dockerfile.fromcore` diesen Schritt: Admin wird direkt auf dem Core-Image gebaut.)* +5. **Prüfen** → Matrix mit allen 7 Tenants (beim ersten Mal „neu (keine Baseline)“) → **Freigeben** → **Dry-Run** → *Tenant `demo-admin`: Pin aufheben* → **Ausrollen** → nur `demo-admin` wird live ausgerollt (Allowlist), Health-Check prüft die neue Core-SHA. +6. Rollback testen: **Zurückrollen** (stellt den vorherigen Tag wieder her). + +--- + +## 11. Abbruch / Rückbau (jederzeit) + +| Was | Wie | +|---|---| +| Test-Tenant live entfernen | Admin → `demo-admin` → Übersicht → Gefahrenbereich → **Offboard-Dry-Run** prüfen → **Offboard (live)** (entfernt Service, Volume, Ingress) | +| OIDC-Client des Test-Tenants | Gefahrenbereich → **OIDC-Client im Login löschen** | +| Admin-Plattform | Coolify-Ressource stoppen/löschen; Login-Client „Onyscribe Admin“ und API-Key im Login löschen | +| Branch/Image | Gitea: Branch `admin-platform-integration` löschen, Package-Tag (SHA) löschen | +| Alles Live sperren | `DEPLOY_LIVE=false` (und/oder `DEPLOY_ALLOWED_TENANTS` leeren) → Admin neu deployen | + +Der Altbetrieb braucht in keinem dieser Fälle eine Änderung. + +--- + +## 12. Fehlersuche + +| Symptom | Ursache / Fix | +|---|---| +| Vorflug: „Mittwald-Stack lesbar“ rot | Token-Rechte, `PROJECT_ID`/`STACK_ID` in Einstellungen prüfen (dieselben Werte wie Gitea) | +| Deploy: „Pflicht-Secrets ohne Wert: …“ | `CORTECS_API_KEY` (Einstellungen → Geteilte Secrets), `COST_INGEST_KEY` (Tenant → Secrets), ggf. `MISTRAL_API_KEY` (nur bei STT-Provider mistral) | +| Deploy: „… nicht für Live-Schreibzugriffe freigegeben“ | `DEPLOY_ALLOWED_TENANTS` enthält die Tenant-ID nicht | +| Deploy: „Quelle ‚Admin‘ ist noch gesperrt“ | Einstellungen → „Core kann Bundle laden“ aktivieren | +| Deploy: „OIDC-Abgleich fehlgeschlagen: API-Key ungültig (401)“ | `ONYVA_LOGIN_API_KEY` falsch/abgelaufen; Key im Login neu erzeugen | +| Deploy: „… Freigaben: existiert im Login nicht“ (Warnung) | Nutzer im Login anlegen, dann *Domain & Login → Jetzt abgleichen* | +| Health-Check: „Core X statt Y“ | Pin/Tag stimmt nicht mit dem Image überein oder Image fehlt in der Registry (mStudio-Container-Log) | +| Health-Check: „Bundle cache v… (veraltet)“ | Container erreicht die Admin-URL nicht: Domain/HTTPS/Firewall, `admin_public_url`, Bundle-Token | +| Container-Log: „Tenant-Bundle … nicht verfügbar“ | wie oben; zusätzlich `ADMIN_URL`/`ADMIN_BUNDLE_TOKEN` im Plan (Deploy → Service-Definition) prüfen | +| Login der Tenant-Seite: `redirect_uri`-Fehler | *Domain & Login → Gegen Login prüfen → Jetzt abgleichen* (ergänzt die Redirect-URI) | +| Login: `invalid_client` | `OIDC_CLIENT_SECRET` fehlt/ist veraltet → *Jetzt abgleichen* bzw. neu deployen | +| Zertifikat/Ingress fehlt | Token braucht Domain/Ingress-Recht (Log: „Ingress … NICHT angelegt“); Service läuft trotzdem, nach Rechteänderung erneut deployen | +| Admin „Zustand prüfen“: „nicht erreichbar“ | Tenant noch nicht deployt bzw. DNS/Zertifikat noch nicht fertig | + +--- + +## 13. Danach (nicht Teil dieses Tests) + +Erst wenn der Test-Tenant mehrere Tage sauber läuft: Core-Branch reviewen und mergen (→ `build-deploy` baut dann den neuen Core für alle), +Secrets der echten Tenants importieren (`python scripts/import_tenants.py --with-secrets`), pro Tenant die **Cut-over-Checkliste** abarbeiten und +`DEPLOY_ALLOWED_TENANTS` schrittweise erweitern. Die echten Tenants stellst du **einzeln** um – Rückweg: Quelle zurück auf „Git“. diff --git a/requirements-extra.txt b/requirements-extra.txt new file mode 100644 index 0000000..260ab33 --- /dev/null +++ b/requirements-extra.txt @@ -0,0 +1,8 @@ +# Nur die Pakete, die der Core NICHT schon mitbringt (Dockerfile.fromcore baut auf dem Core-Image auf) +sqlalchemy>=2.0 +psycopg[binary]>=3.2 +pyyaml>=6.0 +cryptography>=43 +httpx>=0.27 +anthropic>=0.40 +pypdf>=4.0 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..3a75a05 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +# Admin-Plattform +fastapi==0.135.1 +uvicorn[standard]==0.41.0 +jinja2>=3.1 +sqlalchemy>=2.0 +psycopg[binary]>=3.2 +python-multipart>=0.0.22 +pyyaml>=6.0 +cryptography>=43 +httpx>=0.27 +anthropic>=0.40 +pypdf>=4.0 +# Abhängigkeiten des vendored Cores (Live-Vorschau führt den echten Core aus) +openai==2.46.0 +python-dotenv>=1.0 +requests>=2.31 +weasyprint>=60.0 +python-docx>=1.1.0 diff --git a/scripts/export_seed.py b/scripts/export_seed.py new file mode 100644 index 0000000..0f60259 --- /dev/null +++ b/scripts/export_seed.py @@ -0,0 +1,14 @@ +#!/usr/bin/env python3 +"""Schreibt den aktuellen DB-Stand (Tenants, Versionen, Dateien; ohne Secret-Werte) nach seed/tenants.seed.json.gz.""" +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from app.db import session # noqa: E402 +from app.services import seed # noqa: E402 + +out = Path(__file__).resolve().parent.parent / "seed" / "tenants.seed.json.gz" +with session() as db: + seed.export(db, out) +print(f"geschrieben: {out} ({out.stat().st_size/1024:.0f} KB)") diff --git a/scripts/fake_login_server.py b/scripts/fake_login_server.py new file mode 100644 index 0000000..1371e56 --- /dev/null +++ b/scripts/fake_login_server.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +"""Lokaler Fake von login.onyva.dev /api/v1 – zum Ausprobieren des OIDC-Abgleichs ohne echtes Login-System. + + python scripts/fake_login_server.py # http://127.0.0.1:8399/api/v1, Key: onyva_testkey, Nutzer: anna@x.de, bob@x.de + ONYVA_LOGIN_API_KEY=onyva_testkey OIDC_SYNC_LIVE=true uvicorn app.main:app --port 8300 + → Einstellungen → „API-Basis“ = http://127.0.0.1:8399/api/v1 +""" +import json +import sys +from http.server import BaseHTTPRequestHandler, HTTPServer +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) +from tests.fakelogin import FakeLogin # noqa: E402 + +fake = FakeLogin() + + +class H(BaseHTTPRequestHandler): + def _do(self): + n = int(self.headers.get("Content-Length") or 0) + body = json.loads(self.rfile.read(n)) if n else None + status, data, hdrs = fake(self.command, f"http://x{self.path}", {"Authorization": self.headers.get("Authorization", "")}, body) + self.send_response(status) + for k, v in hdrs.items(): + self.send_header(k, v) + self.send_header("Content-Type", "application/json") + out = json.dumps(data).encode() if data is not None else b"" + self.send_header("Content-Length", str(len(out))) + self.end_headers() + self.wfile.write(out) + print(f"{self.command} {self.path} → {status}", flush=True) + + do_GET = do_POST = do_PUT = do_PATCH = do_DELETE = _do + + def log_message(self, *a): + pass + + +if __name__ == "__main__": + print("Fake-Login auf http://127.0.0.1:8399/api/v1 (Key onyva_testkey)", flush=True) + HTTPServer(("127.0.0.1", 8399), H).serve_forever() diff --git a/scripts/import_tenants.py b/scripts/import_tenants.py new file mode 100644 index 0000000..6d92377 --- /dev/null +++ b/scripts/import_tenants.py @@ -0,0 +1,27 @@ +#!/usr/bin/env python3 +"""Importiert die Tenants aus ../transkript-platform in die Admin-DB. + + python scripts/import_tenants.py # nur Schlüsselnamen der Secrets + python scripts/import_tenants.py --with-secrets # Secrets via `sops -d` entschlüsseln und verschlüsselt speichern + python scripts/import_tenants.py --force # neue Version auch bei identischem Inhalt +""" +import argparse +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from app.db import init_db, session # noqa: E402 +from app.services.importer import import_all # noqa: E402 +from app.settings import LEGACY_PLATFORM # noqa: E402 + +ap = argparse.ArgumentParser() +ap.add_argument("--root", default=str(LEGACY_PLATFORM)) +ap.add_argument("--with-secrets", action="store_true") +ap.add_argument("--force", action="store_true") +a = ap.parse_args() + +init_db() +with session() as db: + for line in import_all(db, Path(a.root), a.with_secrets, a.force): + print(line) diff --git a/scripts/sync_core.sh b/scripts/sync_core.sh new file mode 100755 index 0000000..2059ea6 --- /dev/null +++ b/scripts/sync_core.sh @@ -0,0 +1,13 @@ +#!/usr/bin/env bash +# Aktualisiert den vendored Core-Snapshot (nur für lokale Entwicklung ohne Core-Image) aus der transkript-platform. +# Standard: aktueller Stand des Quell-Repos. Im Container/Coolify wird stattdessen FROM gebaut (Dockerfile.fromcore). +set -euo pipefail +SRC="${1:-$(cd "$(dirname "$0")/../.." && pwd)/transkript-platform}" +DST="$(cd "$(dirname "$0")/.." && pwd)/vendor/platform" +rm -rf "$DST/core" && mkdir -p "$DST" +cp -r "$SRC/core" "$DST/core" && cp "$SRC/main.py" "$SRC/requirements.txt" "$DST/" +find "$DST" -name __pycache__ -prune -exec rm -rf {} + +SHA="$(git -C "$SRC" rev-parse HEAD)"; BRANCH="$(git -C "$SRC" rev-parse --abbrev-ref HEAD)" +echo "$SHA $BRANCH" > "$DST/CORE_VERSION" +printf '{"sha": "%s", "built_at": "%s"}\n' "$SHA" "$(date -u +%Y-%m-%dT%H:%M:%SZ)" > "$DST/core/BUILD_INFO.json" +echo "Core synchronisiert: ${SHA:0:10} ($BRANCH)" diff --git a/scripts/verify_import.py b/scripts/verify_import.py new file mode 100644 index 0000000..4ce7fda --- /dev/null +++ b/scripts/verify_import.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 +"""Beweis für den Cut-over: Bundle aus der DB == Git-Ordner (Hash-Vergleich, ohne deploy-Block).""" +import hashlib +import json +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent.parent)) + +from app.db import session # noqa: E402 +from app.models import Tenant # noqa: E402 +from app.services import store # noqa: E402 +from app.settings import LEGACY_PLATFORM # noqa: E402 +from sqlalchemy import select # noqa: E402 + +root = Path(sys.argv[1]) if len(sys.argv) > 1 else LEGACY_PLATFORM +bad = 0 +with session() as db: + for t in db.scalars(select(Tenant).order_by(Tenant.id)): + tdir = root / "tenants" / t.id + cfg, files = store.content(db, t, "current") + git_cfg = json.loads((tdir / "tenant.json").read_text(encoding="utf-8")) + git_cfg.pop("deploy", None) + problems = [] + if json.dumps(git_cfg, sort_keys=True) != json.dumps(cfg, sort_keys=True): + problems.append("tenant.json weicht ab") + for path, sha in files.items(): + p = tdir / path + if not p.exists(): + problems.append(f"{path}: fehlt in Git") + elif hashlib.sha256(p.read_bytes()).hexdigest() != sha: + problems.append(f"{path}: Hash weicht ab") + for p in tdir.rglob("*"): + rel = p.relative_to(tdir).as_posix() + if p.is_file() and rel not in files and rel not in ("tenant.json", "secrets.enc.yaml") and "__pycache__" not in rel: + problems.append(f"{rel}: fehlt in DB") + print(("✔" if not problems else "✘"), t.id, "; ".join(problems)) + bad += bool(problems) +sys.exit(1 if bad else 0) diff --git a/seed/tenants.seed.json.gz b/seed/tenants.seed.json.gz new file mode 100644 index 0000000000000000000000000000000000000000..75781a06cb060ac8b573ff4807e479ae02d2692e GIT binary patch literal 986548 zcmb?iLz^fHY#rOSZQHhO+qP}nwr$(C=ZR8L;Pq6fQ!xrE1E&?aJ` zf90K>ALjX-o4bFX(-~}r%y9kR@#%jr_5CQ2?_bhMYd7?N-;dJBYZt<7S=%^$_xRG` zj5y`uU;0BHH2@CD)vE%1qn;sKZItn4ixn~#d%=JQp4SfS|a znO%Lk&@UbhA+GAYRM?eOd2JTrE|hEae{b^j`7kSdF;2vxZ?ejAhY@E!h*lH7+cB@6 zHvFqw6ZQ}6YeFUdD%-r;Zu;5QtS6^N%yHkZkM z9+moT1gNSJQ+PlI8X5j*JY)X^2$?tJq5n08@-{GRh*Z*7QAvkC(8sR78sq2bv(c{^ z7Yi$psM?~ajRM>sGJYD1fOt9_ZD zqMuD0H(=U~C$WtdpIKJrC71rB079 zp z^?&mn{dA$M&MUypWIe}BRS-4VS1-_VBy35SF61(fON z@QDq2O+V_-{_J+Dg^GpgaM{ta1Mf?_jyMhw>AVMA~GasnmEH3HwNH~TtWyk3tL z;My=nKE@4zj{goI*ZX7&OQtdGj3~bw4G#%{|L|UTGtYmC+OE0{KW`esIFR+Qc# zLn3;z`J?$x2>CVL3^vY?W!zs?sjvPg&m!bZ^rI@On)9^22%=FS@=#s%BApu%v0<(2 z;zv6mqO;TIWt$&b@AoZ#^z@`k`Kcun*+RkN4b0(x%aj3!>VWvG^uCo++);bKVlT74 z-l@2NWXzB1>tQQy6G_|oqZ7dkjhSYs`K!25UO$bB5HfzDE^j-}>rf4E{8eKZNlWJx z|MVrDZ93`<`1eUpr%-m@9PhK0!yt)A%pXaYcP9p?{wqUl>%Tm<2TW zh`OFF4e#^ninvV>#=li(#_tBH|LF*Ybkt8O}$hWGQ zcG^C#`uD1#p{8V^uS`Q+gh5;Z6URsrtrSv(Oj81pVbl~; z7Km=bA;n~gRs<4UL>VW>GDI-r{I80)J%22k0Z24~fkcUeOn{zjxDf*dT%J0T;bd0 zF`r-*n^y2AoY0@KAzGo9Vp$S}5O8>Q6za9Sb^(1&;V&Cf~_|;bwl+W=7 z3V}>u{Wa^0W)W&&l4<}-A5&GS_i=Q5!!1X?{^Thi5Z&r7J{Gj)f~{me4<5S#8Nx@P zTD}Jn;rV3n2`}Wfm5)0dk)UfHIL`#X32h|zcbNE-XYDnE)kN?2B`xfyzt?s#T|7Gi zXtcl>*aLYR_-BmJk{+2rHo)dC3n$^|In_2;0L%y0K|tUcPYbA<=UqLqFYnph^ObfG zjPB>eNodzJKjL&5YFK0C<$ZhpFxLPw4P`IL9cF+&un+JKMY^%&o~>sY=qIY(et;YB zw^4tX8~E4JA8k+5@r$?z`2hcqx95rBecTuNj%LbeA&Ny zWZ%m*Kfm4uzwtxf_*?D)y?~GB<6ZXy@f;+I_{o4M@nDC?;{okpIP{cxMO|U-_Tr~N^dkBy)K#DBp5N@I|g#ePbAQDpG7`A|ct4tU? zh=_5(0&B$#S|E`$qJR?MnWO+BJ)eIlu+BR!gbXWm$Uwl18l;RdvB(gGgf#-0F+q_X zaU4S+fe=s(TY$tQ!vqfI9EOp>H(tzsIH->P@>dXeM~;W$D3WNReYC z8Us`X-9eV5K$*`-At**jQ4ClxbCf8<%tfRSCWipP<_hZ%rvi&725@u$E7uGW<47js z5HpZOG1CYGW*DMK5jkKnHDYkY8pOyM0SPWfiA%sl>Vs6(&&&NOF1W1s(0bd%+_QUx z9GKY;qR?`$->o@yh$fh{b>!7RD)=gOM8{nLU6= zG(brkuz*=IW0G9}83l9|Zb~U~gb_1HG6A3#66DPk9f7w90WcF8N5LYe3>=ZbBIl49 zWdywkmu9K*a%9g0v~sNul3$jGJ-S+ z@W=sh$|c2sGXNDfP68SOITmLGTZ=cR%rvr)I93D$ekx`_Tq2YSpr`y@+`Y8>t}#sk zkRPmw3BZhsh>QW_0fHaY3*`uK${Irei#?{0HpC*&05RZ`EMb5=rw|f{_;n8X`>wgi zk9zc9MxJ69{F`0-%X|M*cJ*UN`EFVFR(b#PRf+f-SLR3n-PQlq){TjeCV5MQ>(yg4 zeelT7dh-7Zws=q<3q4)Mj}GTo%m03mj@bAXjG3^&K@bfSP$ZJUpb8Z1i2%q;#t1AR zK{JBDDJC2c1xW##iZ=lPScVzQKp+&z`u2?x0LTRG^m>e-P>ew2kRf21A%T%C&>R7< zkflr-B+h`0qyT})67i5iVgv>j%2v9NAIJ&H9LEJtJ|KWom;nwmEN~1PW(*BjNIC+D zYUGF!#t9*ANJ$`c%!*;aDU<+$+Xr&S7-0e%bYzk-%o&s<@kMgu00!ZcHbN3s2pFZn zECzXp7er(bG-OE}5O|<5j=&$}kx?WYMxX%;1Q%gt06+p7fkUPdO9%mwQpU^+!IUgV z1YRbIV}OBUc1#On5o54ldb!K@{0(0CuJ>E{+|1p#d&GBrI_S}3^YIZsG@tqjIOn(j zOx~7DG@-nl4c7#jLtfEt&xIIW-fmA!MrsRsU&aO$D(MrGdk@U@$K$++cQ4)Ffgk|- zIF1DncRK3djs+Mm-p=2FNPrng%qKj%IILC!HeLIJzy~6V1WgS0oh>+^ShuCB1ZW+{L~auMl=u-i9vuSXh3rCc@Io#NHpApFe{WJ zfX{+ah5#@o5*A{SQUD=Th&Z54<&8bc*Y9@^58RO7e}4~JohSOIxbZyedX8L}!uAI{ zup-=yPtWfUP`PjWgD-MRBxn4rEq|wpMON7kC=U`4{tI$%k@)=zg@V4g z9?tB4`vCVNCDiZN6Z}LJ|9AiFH*Ki>j6E=XKiPeZR8b`Sq=uRYhgH=cDqpfAIG^!XM>{{e{Q%lO|_xv|HY_ zKi-CM(gPU?^qQ*p94uIf0=)DFLx_x^2>>mGj6~89fTm=bWXNa%g#bx%$e0;og5wu& zYw|r2hN{^xpQ8`unT7XP&oWP1nmBj0`ogH2H^4fOu>O2pUy zabKSP;~USf^LFR@ej(I%_Z&|B*Eft$|1*u;z~B3d-}QZX`9Jx174A-(IkP@d8fexBetgcipY$-_vo& zG{fIJZ2$HpT>b6Xo=W_=k*Pn{0#~GD;F=<`u^^Z>_AAk;4Z_;k7tpMSoJ zJvsdJST1n{Kgu9ekMgj5gLwcZ`t%{1@}cbZ07%1Ar5CxkAzy#TuO~MsfLAj7;fhWY@pZsz zKjUfHLNvE+Sy}M0nRR)6y_Y}cFnP%r^Zw)Cc)Ddi2v614`6}|?t@)F@JK4j3)Js!b zzMU5D;|gW}kSK+gzm7QbS`+kG<6B8wbncIp+@O%?2Igk!&E~Pj zir?=|L7l-oSjW+UrE1{2j$-Yt^9gDfb4asu4Bs4Si^CVZ! zz!-Q=;8SO>ZGoLlj>2;|_))LbtTQoK4(iIyVMckVj=l3eE@W}%W z8QNpSiT5~kvRSiq+4o;Fo-PgWNdh4nW<8 z1bKy88Ld^xiTW?AH(ayS?)AP?rtytR#`&9mpVSjxoy!Xd|2yr0zu#?t=A2zk_c&06 zkDg=oca)QRIlq-VfiLKH=rs5=>_U*5&vKr}YC_ilO$Ku4$OdhY)|)!83Qe=-^JZ-H&;# z`G@Wo742cvb~Fwr@=5ICuXZl{#Y;Dlbu01<_+EQ3_~$eiAfJA0gPe{K=-ziLo()~r zH-O+S%xl70qXGH>M4#cG-`n)9zv-g*FsnCWtJER$=a0FV2DqKG2;Me*0zBgYrspeV zn52`{Bl!1i2m%9u&|B^cpXDf8f#&y`-B#xb>uI?F^`Eh!E!%CN6kzL>!w$30FF2I3O)e$12$y|K$cgrz>uQFbBtAW+Fr$)Os zvi_Mo9a{3QWV;xw&$ZqDe0oR#HUi5GeO{MJH{Q zwccRi@51V$Ew9TebOHEC%Au#_TO5JC- zHjwx(@Jx@(uLOKQG=HlvjCk;IdrxQB{hN5hKjK$$4Zbfg)|om3$-(xQD|T~0umlQi zRUL*Qz{b4=!2tmhomP2s_{mx0U0wrsH^zDiz4 zLs3zeAB=O}g$v|34gl~mjS4#MNCAKrf8%;sWjlv7-i`ERqufneZv>6M9$3w^{e$qE zS*XWb7cnURUdL}hhnQJA> z)xBfgl^aLVgzwiq5M-tRMFXve`|BvxPUB{%DS8@rGgWtQLlAu$W813k`$?1k`=R2= z_X@g2P2fUN{KL?%F8&@kUnrjp84s;P!ZWE|9+>x(SMosPcS7m0FdAtu@29+{$3#^P zj&D8a{z?2x{^_Br9N*M@uc4@>!2nH|2-iZ=at1F_xc?_qP%1B$gnAuMf9h zlKhf#nZ7BALCdRY;5@Bfb;V}Q1rL}XEz(27LwTN! z2%nYI$-~#uRv{x$*FzH{($&8tZsJ>0$FxP4%1 z+qCB49J9qV;m|M*_`up6xSzK}Xn8Q`J(>tFLj(a-XagRc`1lK`=Q>2)nv|M1M|!y4 zUR0jd;?AL;%`1+(g|8!Te#ua6>UQULI=BeE@s0!69um)Fkn?Dr%lebt;BY#CV!fQ} zQkWn3d3`vUhFnQ4;mNoHo!iUr5~iIiRIpa%@T-+h7lTdR*C*FA7>^hsTP15JOj*NN zqR(;`FHaU-k_ccGJ7HcGsUZj}U@9)>G`rU^!A#Df!dm~<8Nm0mwfAqHFC6^WwE(f~ z2A%wu%_f;&8!8;Q;~7Mf17a;LRUJXl?p%1Y_j!p=1gNR|x~I22~=n=rNTSMR0 zxnbips>x2qp#B7~P2?Ks=BC}5N70!#1V?zQAD~VXWa%Z;5*Udk5)W+M4rcpkkF5LX zgOxtSc6HaYMt+^B^p>i-?6$Q>FKkL|jBk{@;yi5&ah-5m_h>IHb6j}LCZg;oPWQ~=e;9{ARLsCi@aL3rl0og!ngkot&{vi+p@rt zN=seXLxO}&e5sf>4|ZNB_<~nOk1K!-IFzg>(gHGPIlqN z{(|7jNX=5KNQ<>)6({lCvJH9JS0SZaoUEzx2D?}K1#>gAG&288N%MeMw$_*b3g>{+4Buc?LH7mlhO3E$C-r#QD{G74tlZW2Te{q(f zL-4eRjfGabL#rHNEP!O*#hsjb7(NcyAEyTXt=HV<(H1H{F{g>Fy)_z@dbVB|xrK^hq)PUeUs&}RHXcWd+Lvi6YdY{rpu*r|h%(@#|DFIV1tUThxcps`W zBIURmo8|(U?!d(nk}9mbtDAI4wO-dD(7T(HY^n+9Ir&ce?qr~QZ;1bwo&LYi{BJ$+ z7{~mag2mGKUkT(=@=Q6Awz;_bCAl%@*L#i0XG^qAoN)9?+Vic*s)t@jd$;Sk*(cg( z7!pZkvE^oFA6=3kd+SDHItxLOjJseWs=4>|7^#J6hoinP9DTs&#Im z>1x@?v=~BqSNw1~67LTI*Ty&s=KMsI|8!Q>#YTCwQs>^?t~iVL-X^h!2Ay=cd@5k< z);=DDmSN$K)U$GD@CyTZlw8)>$0SGMi%d~CR=Xlr+ey~)P- zWH-Uhb?vWX=DaO%R*dJT1!pcUcs0XWkJdw~qBUqOx2JH)8Q@XKkHbq4sp@9B;E!2#h{LujI(?Da(LK-uS#}%Z587XU{M|@!+_l zHPr0T4xX!SOj;L?deV2+_*j-|qmN8iK=DG6&FxcRg2oA+7AG>?X6c^ZUdxUyUbxC5 z44hu`q$#UrCc-wb%7oWr=PoEiubJ{T0IW&&U55W2ok){^^U7XbW6J!NpI#7lmK#z) z=!;)N>$g@`oKYr1?2?zZXBNw{Avk z>I%5Uyx(;mTiBvnfFsKDVj#5yz9?2-&u|KHaPq|u&0eZ!^mPq!>Q`xG_4H=cL{J-| z1g*)=GyK{@>o98BZI!Fg5K*C64^JgNd<-64U??tO@AIkVK`WT*gSW-e zVf#E>>&kvL^O}HVxk<*@MBVY`tb5I?LNy?#c3?AoMPmZOSz`jfhZ8rs>(0KkimRHK zEcXuWp2f-%^E4NkJvVGzn=R%71)e!6vtwsw&2*t*$*=ZaQiRqlXNu+Wt+deNBZ_9u zTW$o-`^Q$y6o7noV%k+86EMjeK9x8o(b_G7QML(pitF%~h^6ou3fZ!}c0{tOQ+#olIWKj6SLznH)ea*I(9BZcG+?%QP z7B0%>Ze34u(s(dM#I-$`-}04wv#ybiK0)?nK+l4b%i!g@0pnfP9^KX-p)F_=k2!b4 z-m^j1B9;OdzwJS!Z`WIX_EA8qvWTzpxYq2Mb3XDwcZ_j0my!4GcELjLswxt_zV>K3 zo+ID+ng#gaJ#hDSXFkkkF{*OfwU0tNWBVRiL9gv{S2!(sjO>G9_akJQpqV5AR6rQv4HyjwXg*Algu^Q@$^@svTL3JH*KS~bLc>o0!Y5w7OB~r5B4H)7Qf1*| z)O4D_WUD+zwwLH(eW&ww#o$La!3ph%u}8y+Ddug+(i+3-Y`2K(RIm+|i`Sc|*7CwV z8g^*Bk_&7HF%88Sp-_>=$GtK^@L(*it298HWJ3Sf#;Gg@bNoUpv#RZqwz{F!uBNxX z{R<-FmPG#?2e3GaE;RuBc0m^>DCc_Dvs>7?eS9O8^$e53&HitXW+t^>;TFw8oM*X= z*SE>uwY=%Qb@I&tW}nnOp|dB!wv35Rw$XXpyU(2%T3QNgT7iXH6crpZC&s)aHGGcI=^}Pm-lGQa=E8)Oh z1vyzMye+>BQft*U6~)i$OD)%6eA)q>F2qlOjWj;pQRexb6z)RUhe(ZB>jxzKv%ndZ zd@P>F8>1GxG>mF0#az~9t9X7}PWWOXQtW!p!CXwvQ)20zRI6d?^)}Oid0J+QAvilbTsCdRjra&3?3VM`o4*JdO!f87Z8|sgmq^p*o=9AL>O{J2%m}h*O2d3Jf_9d@xrrbEoneODu?GB0H z<+j(SncXuveTjqMUryh_W)V13A7ap@8%F8nLR};H+&~{VM2mnD`mpA?E`6#4d-hdXPke&#dA>N^zVrT zZ&|vdtCPrS2`;g3v%|%V;>qHS`nS+F+O58$a=r*`KuHfE3vDqFSV9J6rdPVR&FJc@bI%5KBtSy%*MXdC+7^s)m@{I_3HGi#81SaTR#We|xTZYAT>yw2>RUuqMVoZiyTl7oe3(Ml z4q^#E^ZZ}Dbn~`g}IQuXz0)g~$lVN5gJE?82Ouu+LxxV%~BbX38H!vedzS!_Jq zi7L^CDZAl`3vzt9T4AscNA-mYC$P+gl{??J9h)y%U;{ZVQae^Rfnm6ij=U!c6)o4g z-0wLp(YkGQzq1sFV;y)@^W-*TTd#i$!@XDQRbEzu>TfB;x10QW<{&RD2vzo&SCg)95Rk{upwqYwK z*7MFAZ@k%>t*}REw9~a;SI(4gBaHW!rICnr8Ma)v>p4y_qz+M3NA6&T^?)jtB>0&i zsSJ4?w^-H8=Tw&f*;ScQB#g796V@(&-o zSPt>S$Xk$B)lE9`1IEnBHwduGRT$tyx$ne!I;w%aaY=}pd|`~s!Io&5(HttiS!CFF z<#07MS3xCCCNShwcw)`$rx>DQk zlKRK>3E2mOv$Fby@Na2r#S(6Vi=AvIR9FRBiKJP<6E=C z)ZB)MV3naw!%EkkQN%iM^<|LasnKbV=7(*)#y3SrYgR?-CoS3)UC-h4gh^%keWe8? z*V5YE>zN;)0E2?#;_iISc8Er1lfajMu*WasCRW*keEV69L%j}lHANWbJdeB7yp7VF zWU|1f4Xrh+STZgwp{zWqLZ_UsdAWN7_|*?a5bol(a`Ugu6QlX`l*Fui85bOq4a`L} z;L@zhTG(5liUvIq&IQb4d z&#j;$h6ya1>mmk#a9myazj)LTQ*HJ%zQW|l9z_l_X&f$Hsf=- z6=C)Sq``nevu`73Ysh#ur?+{zHajl!23&IWe#q5ic-O+D!XFlyWVOgI7@1_iigyu< zEq1n7LV+VW9;_?NfEPszc@!E`pcbZ9`K?L_bqo3&E&pv;Am*^ZWR8WXT0l{5A4M@6 zJx#airy`~{4+1lZ0YHbQGJq|k8A%b=@z_9wcaILa-AinD)fjnQ4dLE?n?!|lZ10K` z;{<7Cq@e$NZ5hVDPpwc#3jnh4eQA^9;pQAc%k&*W^OT7zkmv!b!n%GXb86$vt{uc;yQgu~x|PWs;DDEs4C~%dYANxx3J?gl^d412_`dZE&nR-#m!e z-Q1*gIQrScHCJ{sIwD_PtB=bRrEwgzFQGE0Kzf;a;zn~89dwl(qyor+F}gZ7m+SdF z?d-HpQFEsKLNio_v_0AMwCRfO>oj8N>mDGHi_R1?5zq}$!JZTA9Q9DMwt{@4mVv zD)lv-Xx3fb(G{?bG*YD#eOV4q6ZPzjy`BAw@9uAXfxfi$7UE_%E1(wg@s;qb`<2+< zOi-BQ9WTDeYPu$|)tKCEmkzCJ*Iw&t&j|T3v<0L^k?2{s5eKXzHqthQ-Ll1cf@L6x zr5fUb_C`-C8rBA z#eVYx>_vfhfs__3^j;AynQls)m4U&CUhDs5MBF+CL@&u$8VcdjY=)&w)I{DJu_&E; z#r+hN(3`M%e zm633}!YUV~ad9aP`9G&8pxZBx!s=iSqswyDJxjVTajtlRakcCfdNxRTPWMm>UM%c# zSW$y;Hg(uPND`UDKgW}JKT%Ct22uH5yRP-9s1R#dZ=ZXy5!)yTU(s! z5(}Bbys;yPmSvK1y@4K%CyNQ>I7!iL!$w!M{ zUWNPQdn|0>nY-burx3^01#S0md*qO_;u*9)k!2A|%ARVQ**(HtF;36_EzAl`_+;;vB zar6BEF!|)hWxRm%niW@g(VIe@!glYgB8+^PUThaPRQXsDX*oyiRJF6+=4L9!?2M@8 z#1rbg3RoATa|&yo*y=aPmV>3$g;&btnnf~bKkS@M+_Vk}CjLnsv-g2x&sO8bahJ4N zwwgJr771r`hejPzl>_tzwYw%(A+Oxk`=CAWBtyAMeP&fJspYOFGmT0l{VvO)8Jj50 znlchdgT9$`h-o82<_nF$#5QbPwxARJ=4AtX;AUK_J(c4^xvNEb6D8h*3!Zel8_X-f z?gKw*Abih6U|{2T4-l!w*SF^tTuI~u5HL^hGj_9pQ-;G4BmzY`uhuC+KwD}hvA1x2 zv@jv^g#%0}2x#a~5&uJ*@=yS=a}qGMlxQH=tUZLl6FH)W6Mr}}cD5G*n#m}J30DIf z&&KBh`2k0QXO-Tv3>!+B4U|xM+n(7gK2E&X^`?aCwj+f@&$2|A?KYA;OIQXgyhq-H zGR{FZK3R!gJEm*4+%L+h*?C_YYWd+qde;Q8TdmTIXI?vHDXxNGds}z=(y}>u1ZJm1 zJ4S84d7soWgVPdwL=5yHdm}zU2bCq{e4S!%j6^6DY3{`hH64WUMxG_{o@FNu@eWN5XlTt4qDr@w?9Lv${&KLNgMXoP0zJ;q07APq>?49_KP@7qUfjSgPl<7q!&Z z?8+O0)S8Y~N~#h{Zs*pGcV$tE^$f(1NDdRcAd#Q@OV{7>d#5v%v#l4=E*6x!VS(?V zTNx%r;LGktruwOjz%=HCrUCGy{Nh+DVbom(FYQ&C5^x-a$#r{fVmrC2_ z5w3|~y3|b7w%Kq~U2G2a&`j{H*3hPxRE$gCr41!Fh2(JxdK~5mDk{w+MHn}q?ubq7 z0st@g@@(LTC67>WM_|SQT()kWrb#hA(x6IO1EgL^bC_C&eiHj( zob3TM+!d=d8&2a;e09?D4EqYBHpkYIDPeNUCyqtyKYOTUIU5W>m#98lf!llv(ybiI ze*;SD*{!pV6ot`HOn%dVelGf|J8$1;ePmT)br!zlmDvW!$Wv2&LF-*lE zC#=e5oiXa66df+Dpt2dxD#rG403o-uSkQdW;YJQT>9J#5xRbvrdQW^))l+8vM>5aLkdXv^B-B+P`YaVYtsQqz; zV525H0yRBz$(T_7Ei>NQx8a1ZCn$MkNMowGA`Q)~OKVt{Du}}zFUk!(pmVJ)``c}@ z40uA)U=LeeklE@%No|k&HiVUL>pg_MfX(;*b?$gl^#D>CegxP;BEp=g*49ArNF(}6-b?Us@YhN#$f%qnpZ&Azl{pwF{--0r%oiD427 z>KXHZ8T>G7&QvNgsHbQ9+C+YhP4K(4oPLA(52C0yc_R?PG~@(Q`wXYBJa42-J_$_BiK%mG?r_Oar zU2?tN?GL>VwS1De<7fTlsap6|Lfc7~qvKkjitvXkS^8DRjS;TNF{-vLlH(v9%IGMm#GOwsbX2i0sKE#WrL(l~tlbaLu~xdjTD1E;D`Sqy?@#>Nh;tL??^>r4iJo*HE;~ zr<6uCUkR6x?t`Nw<()VTjx_AXwA&^}OnqCxafo}N-#3b8Y}PsBl6T8yLhO2PN5v!V zPmjKzk_~8s`POi;O$oK=K}aKE{^xpYDUpmd0RBAP*qD4i{BB5zbbi`JCm&Qn+)HHZ zi?pKwn-TnBc9&oXYRJHR4O> zKNVHhB56$oL9Nrg8crY4N`e30c^etrZDA(*(hHte9WHDr&*1|(AT1k{XU=ar!r$O# zc5-df#2IGY8Fi~P3KrsRIJ00c79>g5mm0u?w9|oZUMCg;9Kj%yqRwe6lL%0#Y{yF~ z>r_u1b~PAgN%lQCcuRY%H$;V+lB(G=nFyq&9=HayhMGoT2Nrhx4D$CM7t<#t68h1Q z2VTi3A6T>E$wO7&G&Ur9sJ~J7E;E4RI#008e#{8hBFYe2{%~Hm1T%>N$c~yvzpg;$ zya{S=AJLaZx`gsgV_O#^wUi;X9{$rM7^WL5ESGNph%Z1Ri2$F&d#4^=hlnjqL1pX+Yz#lvc0>FHL03>x?cGwe)AnNw`AUgt;JgftXUVK zIHNw(Gf_F0QU`&78(QMp|Cw>%>dWuk%GA8tv?=M0%%VoMH=L$qhb=A3IMG266FD|3Xuj!A)zhkDxbU zGlCPJBz^v!25fU@vIm*qX`ZgR!)c8SE}RSdKL9I0)W6wW1tcW&LO|6cHzkLa!my%&V&fTFnWf$ork}XSm%fsSB`NOZQVUBJ>f%(Sv z4;Yl12_x)ivSsm-6ez9HclmQkCQ&Y?N+w)oVY_m7ju)ZpUaqP;quFs~BVdQt`ng1p zn5HSsl1Enc2d0qtUCn`Xq2^?f}QT%k~FME-Ku8H;rUy> zQQmF26F!@iFPZHCr7?~syT)G==i@r@DpAO^L<_pPx#HA&a ze)9O-DY=bdu`v|otbo0Hi}L#|%RJ9Zt*7gbCW9YJqXQ1zcnOXnynMlX`{4C@y%zW- z2vD=IJhohleaaGCAJyvq)_PHgni&Wyn|JYoQY2Olr)zY2{${$}K>-?V&PZ^;ZZ=FT zIWs!<{7F^3RNgUhfX}Vw!u56k1Yj171PG9H_&#zis$$8JrRQczFW;Ek^aWWNrLqJYZ+E_2^BpIpXwJ&k-@NfCjuD!hTCe&M}cOXKBclD)zANQbkRHab=r>WIttHo%?gRu0KlWr#_kut}o>+d<6xj~S}NCEuL{ue%~QEs7CMnt40mw01t57W~9f zhFXSxvSi6ebrEW&5y>%N`u$XcvMP2V-r$n0Aj z0O&U9wS_1K1?3@kmkY7bOJOi6R8twF$*4ybd@+0gh{nO}jL6?zVPXti-KSG^GeHK? z9n2#jK};a?ii|Qw5*w5J#cJQ)6iJ*Y?3O&%U2#bJvvIEB;Jnh~vwhzCo>Ej4tHCz# zR(8MSSipGTgc;|+;7wZrD4UR2R^1ln-`j>1OMr)<7-%LEwrTWtq!>fbz9pNcSY-Eu zFk#z!Fv=b#P9}vkOU70=VTlW+y;6|oCzi1q?zQPHxjXb={`zx}75JgMo8oW4u9c$N zua+c}gTY~ur!q?}h0Yb?oX81hIPG@H=1jkr?+HbWOUzw)WGq6(~h&x8ACJ?OTZXjkwPgIi>0 z`iXOc@qn2MxF#9U6njSJt$rZK>YC6HQSBs`VEHRBTfedaVtEVhdSS-!#aEipO`8KLWsVzir}?6koX%OK)q+9Dspx_{QEhuJ0-&tU&8!UF;cZvjFmE zWL&R%pv+$Mo&OeRME&5-2vtu{fxy81+sP@ISw(oEfq6ASO&b#u{aIog(~OZ+cCv0BVGDoBOUv}VM0WcE9+5T=oaQ2 z%|Vz97KCSP5Y0MnI5ZSOT5Dm~a-^ar`I{{ES42MAq(>j~m7gD(vRvk4iQIAGzd~EJ zQ@)I*ko9}KFOz@VR~***Iik8DWmI|@&hQ&i#;zEh{C0QL2uR{flY|g%$9b_uP-V>n zJ$(i-vrtIQ025}BIY~{e^EH#(XXh9R7*Ssm7>DxJEpP_8pMcytlZZE}+DT6MlUfR0 z%wM<`BPGt*L}|02JYq??B_0f6YlAA*;r^iU=J0t#{&l|!v<&2vh0_GmDM3(!JPrI_KKO#U{t4uks}COGe4GEC6b536c}XgQ#Z0oToxm43^*#j*n^_K@B&t z@Y_WBx)DzI$|^w&5%9Ue2>}TMsQDNIg&xL8#fM~T-Y!M{#9HGrak-pk zIGkDp*FjhHTaMy|s-BR!+0w<&6izlE(`VmqxiRddCBi>Q9~($E(tQfsb$tJXM4Xp8 zp^$YRFFDmWbo$*FbaFmyh7fabC6%|NuLBoT)16^>q$w&{$XG<-h3*j-*i(MSy|m;4 z93p9{THTIFHuM-NGb>Y+c2({`DjvtDc2GbtQypAqGF^aF8ET`I48z`KV~`Mg&}V;^l24yfd?^}z9rK@<32!T zZzn{jneU{UT_FL#cIH(|q0^Lwkb6Kklq$79&P1NS&#$KljSBpb7v$g`z{-~N{z%_$g-Ej#iQuamxgzAX!>!DAl|NqNHQC6r!(~yzZVfV&VhDz#h`X{Afgs^G^-qh zYZg|?8ce6}h)!o}RX92aZO#XIT2lC1E}OB~^00WhhHZMW^LXvyB0%p^b-!yM_;?%& zae^PIS|-c6`n32 zEM48gx8-xXG&pOQu@s+~?i`}t=$dEjvSu0i5b-l++`Etu0o|1}DIbO9Q4F(TT1T^ZmPKT>H4t*$nNcDLEg<5jRjoGg=Up82!fN%F-~iX< zCECf%z(mCc9($%dD89h3O-@$}Qb4 zvv2#pd+kQOn2p+1s@9VCC7S*AH;|M!02cUfcYy!g_nAu!kW!umBg}N6!!rCE&U*dg zjzJ8JpNOM+{rK$fIySt$ejIFcD=%BlF{GCUpPmRu9`n(eu$I|1WqY8((S5dS3mL~r z9ox6TfbSfVoTzr1G>iAXUHj(~D(@G|bEMz*CctFi2KBg1spZGmwFV9AoY8|=>-SB+ zaR?yyI|{G{TBEu8ZWM&h_F9IlSoX&P*zXK@z~WpYS8&N5%nLh?sfkJ+BnEy4l|LoE6}U` zRcq=<3pQJ?L4rO`&j0ATp9gjxPPj)17gaM2C2S)_BN+cIPrgzXq;27U!3co%|f>$!u zu%jFr>TS0;{L;mv@jv37#TMH^uiPQFYZamU)+(SWJ)8Y2Z$|?)!96tG&+FbWBnZGN+H;?@PeifKE(bC^cM0Pd@J$!ms zPh@d4i9$6m#j-9+gL@srUF(bQPoSeQ!n5idn7YbcFN#yF1G{LbA>;~e7a0vJX zdm>}lBCDG#6_k?u-4u3d7;~ie37k_XLCjT~26i;%ceDL+CJmNQyFdvHp;Sf?O9D_- zH8uPx-jI-C4_*N$Evw+eBHGB7D^Tx4i19i*=cwU{qH?Z49^4_kAB_s+*&aC2#f(%} z(L(x6_wds#6~sPl9}EbUl_rWOtO4@?P8!%!jHsy##M3lKVEOI)ZmN%$puuETL1P-4 zMC^IOH_FLQ?%A20+8Oqh2O0#p?oV61H>Bj1A`NwV4ur$l!Q7_UYS9j$!|G!~=|H

t4TM$b(?^rTmWI7lXyn(06#LxFv<4Uz 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 z zKlAneb5ytvF9-V4r++DI^jIf(F*}#x!-HD1a#IcUn)^%wTuTYmFRBZh&kds+d|2X=02eVDdWgBDP4>+WK!(2h_cn6q>blLs_jWX z%aws4IRduJmJ|*TT!n z!mzM-e3vUGcrzB6O1AcqD$oIB6+fWHiGQ5VB{-#R;ZFM2;iI|sV`u+LtDW`eZQp^AbS24nTF z1kP5@a?b~L%1os9rB)BRE|(154! z(28|_OJXVo>OMddlqRDT+_2>ZN=||n0Lg6MD+c^7_VF{ErT=2OS5B`*uy~@0FYu)D*i$S|2djLMEddbWvaWn!|Q3OKzUr@<8CnD$XpZ*ev>=7D|yRwwtXk2 zM^&Em9M<$Dk6~3hZ`eSs>osr9B-YgnaQH#@Chj=iSD1Jqwv3?#@O6$%BdF6Gj&RSy z-qsg1g)yYc)E|_eV{DfO=rsdKXYGd|tKx0ZAJ9mJq|8V}<`reCT{W9hXMZV3tGvsU2d?u6 zKU06z(Vao0hl1De z!T>+dR0y3S^G+Q*HXP<3V3L=OU|Ek{1?j`s>lQvQ zApRl5lPhvVZwyFruqr$c=lTEF&&}5_ zAJ#&IrLe0ePc*;duRH;NYa6_#lyD$xSYoc5IyEWNw8Gpx5L>$QTm75vtZ7k(q`Kce zMheDWc~Ce33r8y)$NIX6q>`qDQ1X^bDzd`s^qrKz*M>2s0{7)SahkbDYGJ+|jznlM z*r^xpD;|22|88RxO2oilG|W5mCxF|`RPIO1Vr{sJFp@>5U{<%%t+2!J86mB4KR%Fa zaB!r+QO4*Y7xv$B&EWM&{NfTM722$?#%S$9-25(g_{3;it~?L3o|FdXp^RKa!RU|# zb3y+B{>x)5N+BYoz!hC;f4S^dLqzVs_D?u5smItYx!UiaFbVtTk4MBb7h_`4e-w2r zy9Gq?N-q>z&(M2?D0cIP7^({ClwM~J&jok(Ktfp*kgEnqAxOE7_P&X~S%$ja-_-fv zI&PLGU}^h}Ds#$R%ps5#DlE?}#j&0mVvL0+mQD{A;^>v$%>duu;l&^xl8$)p`cU0Z zrsj>?)rr&9_Q>zR*R=SC=ys3W}BcRyz%(r1drez-G5r)$dhggD$HQBJu8c0SNP`rd|Ur9+uuCB4)}xkWoXZ8 zYK4Dw74mqp6>ItL+{I5!TYXh<{kxcjh4k{!WA+;OIm zSaTK;0hL6=CEx3+#}$9@Us`8HzFBc4wh$q`(l1Blm8 zwqntUxl1M>YCE_djJt*V2Us4d`+Vn|>)a6`VBVcRjr%VY*TIt_{&h<6}nJkI3 zy+q)uPByVlG!dO#nq-*&)f(uSKK5rr7ChX!M5zlW2l%gGy1>8*u!BoF5jNzjOJGJI zVeD@)$%L-pXoBNNe`Hf@2p+r>{q>qLq63;SK;zo7Cz+xyw;6-dBq2dB7nxU83%kyrBuGPF-fAjAuN zW!&bsjS_>T#qZ?QjmXUE0-tcoP1m~p?*vgi7xG!i<8u@&lnid8vTV-&M$YoM2e(>) z0wcyKw9V*{5SW_+u`X+5$j6$jT6R)C*o@xfKzPgEQjlBBZ*d0|Z$`HfWy!{Qd^*mH z&rTJH&D8&mpe4TA#V~Sd$h`3yL~wH&CFmpvj4*5bou$0vj?%`yh9p*7S)MT|dn&$^ zHX-&GfgJ!N5P}>IEeShPRV!<)(Wp6Stv5T_0QfcN6*C?I46*UI@azq$n@vs%{?+5) zm)^F+|J|sKT7^zjb#NhdJ6_J(wu_=@_V1P`zl9%1`XA1Hl}}J^XvxSNHk9jBZW?65 z=WBR~vRui9@uH(jXT7ZGt06Y#0}Ez)dL2!S0kSQNw;7C;gz<0FVmq({Whq&Gc4+Ep zm3+{UM2p+B<_({QD9mc-c2*Z?riR)B#vlvkymFp*uRM{_h9d$|kcA^7M?k_RiVV4j;;U6Whp*M`FMzosW7Q_Yt1;G-tfx|(NVAgcTj@T|; z2m{6wn;|8@F0(qYL_wYfrj6l3klRgMfRjG_XYR^zX4-M&F=H8<7QND&`Nr>0n*y*3 zeu*tL9{!z6i%Yi1&N~%gXoMovC6k6Y3fTZ0a~Yqega`JUp<`K4(BCw|6R|-00)I&i zPAmkzWX3(d8nD8nIoY8GMB|5zA+@|-Tbe}9loszpRCAUAu#?ejTtgxe@&}2G*Q0*m%B9)H$5dOGIu7$p}sAWk1x;@QAB= zET(4ySWMp;aZAgIpJ+Xil_sMJ|H#rgqLd^}QOKiFR7FLn2_9uQo4@#TF87`LrPT47 zKe^*g%uE!UW^Zp`A^An>lGnI()@-f`Is45BwN#mE$F9L1>+a*Co-3W32E(Gcdwpze zASc<&sVDiJ5&l*obT9dD6U;`#e}AC40KGPV^jSD2^zd4l2-jDoxXlHUwb>}EW2Bv( z|4T8L$t^%eTI^I!k!VDYGGi6sZER6r;yF#@1k^D7BQx||O{X4u(2sL^~ya`R9Q+c$fU zoj(MhDQI{w0WVz5hWZ12u@vB{sE?wB{FZ=&w-F;RYkW ze`x4`gyGA)G4zq-h8xe{PA0k*(QYG@Kg6#%CP%aDwzTxz7@GhVJmlr7I*(@8OifQ& z@1|b>sS?Am=ZMyUll>)X(z5NOhZiwOM0a-gha5f1{~cl_`sH(W+!0Q&o4pw&#;lT@D* z6;b5^GJRs$AP-^Z00C!aJdwmNO<@$EEPC^O74N`&G|?wb5qRv-o{;!H3*PN`4k=?~ z&V)f-f>{;9U~$RFo@Vaz`8XW-(ZAoO{UuW15u@BM=%$(I4c8>2Z`PhtBxuFwJXh%p zscpVK53UPuu~{^pzT9AOEZSC-%?A%PDsg(6W&&Ip;Xcq-c-4pXy_gTphggz?Cpia? zQ;Pd=(F24~mZ44t&U1W4!_Jh2=ztV%Y{i^os%)=71JsDbRWhF%aHbVL=AjN}a~V?8 z;sTRy2&1{3pWd*E1D?7Y0ae_2Q!|)0FDXJOPw|t^#OuNsDiXc~zT!6L^c9Er-ae|| zw@s;jk$k(F*~npC&+%-ez9%kd_cB@iW&L+899fv=z_8;R;gtn|qh5$~tu4N+cN&9~ zcbZ#x(H081?kGXc7M@SU_e99-JNAo~Yi~+|R-%E{zNeaqx+b=n_YTiQc-p6+JIX+$ zQ&UL`;CN;wrW4}Zh7~c5gJVmwAH3#@=oo`Chy&sMgO_XRssYF4={haErg8R!o_jXNmi;XPlIOn^$CdOjYlk@?^cMU3;X{N=<;wQ!HDF(Y` zlz?4a54SWXcV_48P2X@yMyVBl_Ts2+D)NNCfLjRq`K7F1Pb~XP=tS5X!CTpeR+bo- z<|I=Wu*Hm(3# z`jdjj2;Cm#Y{{D@;I`7&=Ei-XCxtdV&YQiK1Tv2^L~%kb3~l&mj2jkJ__*P(NPQ#M zn$K$d_Z3T@B9!O6IvgA|fh)V7RI3d)#{Egth%E%Jxcnn8B4?7%IS8hWlypQm56z)K z=E&x1&JYKnNYg_Hv}$3FIH|{7Z&hwRIn&*JuKjPBCwq2BbaYFoM>Wt8SAOD}5Zit3 zLeC1{^TBiR(rrGnx}S-_c~rH~fkV>_lCNFp3=qD)e`4xnijDxH*YjcLnet{Tda8^u zv&Ql&O8oSEcU6+aDaI}nW32Yx1ju*u9K5O2A^TR|`;#?Gzp!Q7LH7fpHU9ku;YmYE z&Kd?`-2mJR#&%PZJUB9{JOuVQ16lEkX#srx6`}n=Gv$xiIKq5_jIdv|ynFTEMoBlnv**A4ppXW0yY!URod5FM zzr0zJo~7zD%DHeJQav*;<<6Pre(pn5A z@sbhX)OyMqC8nd+ml)&`kkA zk_P_cbEqxrGKEwu^A;SM$gkyqk$GyB43Kh?H0 z2v4A;tewAFrJyHr7o}11?Op-hKKvW_AcbULm;i8yS92*{|Gr@{j>E>iia(;fX&I3@;2ZlERRt#Y zM$}5;uv=+gaoM3^yfF%lUqOR$IDtA?DPnpSZP#?)5=rZ%TgaHAy=oG707I(B^s|ed zrpoqy0S_bk&U*7&%e;|?b9>#(K52Z$2i=G@)Ie0|zl|Kh-J`$VJV#o(thuInj-Y4} zX7hP|u5bG%lHhCVzAfJLI;#(FENlW}#(`xxBL{+fc}#-6YR01uKusLfgJk;Qs z?X%AQ#wAMj*>J;E`|A8|HS{)7KXn1`(QjV`Z!_Y-xh5=GP58$caVjkp0~F#!Jhf~3 zE;*YnX>ns0EE&=g?zJl`V|2TezyIZ5trJv+5KCwpShM(}S_Be|Z*FUn8njJ+ zqxa@LvL1iZ389r4C~q5CBB16~pVPb|IlR%E2jpTntNIM-~TGDn|<^$b`4@SwB!LnghJ|UMUJo?ldmcvHH zhn3ZtjtR}0GKqxu^3p_TLdnEMb`;KwaQetU(kF>CC4?|3i+rM$hicn|)58+PxGATrjs;zNL0`q4{VMx6!`~3FJ+j+YmJ4xgF50DyLqv#*uK$*`}NIWhu$2Ui# z8L%MNum$NW(@$|TV3D82-gI@UuW_DcPm%T);}}Q3Dh}y5UjV(Kw_Gj6PzYdrM1`0>v_JLZ)moymISfLv zHCNNf<3(Z&uPhtia;(XFV%k8wU`&fH*2_{bz+^m`_QBuNXpGqJe)RBU)$I|uvL<^q ztKv7|iD_rA{AQYexpvRA@+LpYe#MQn^_LrnzpkFYijX)2f|sLWtMvFwu`VAiyiYh2 zI*UbPoHH`7isCe;K0aZC%P2ks-Z$d-*F)9AFDM2#<%m}pwS~mP{c!M@~ zyZ1k*cW_8pi3B;G&#N@*m|$8y?~moTq{j%K65<;8x>4u;TBn4{#0Qe;IxsZ+N||)~ zfOvr;DwOCyDIgdlv@j4Wc!A~*ZD@=fk`kW2qnb*0T4F**jq{3(7CCcbxmqnr>u6`` zd(LS)WSaazT@>1`+(ylYNz#hyBHRkdZ5bVj@ zltUed*lCR2r*SFpjqno3@loGyQF#1!UQ7A64h&-h{b$j-@$V?_2NNGAh3jAb`=%t& zwvoQ#mUfryVSIWV)w&avXa0o;U2qYzD@Y5FM0Snj`xJp7@;!7lfchUv)m!GQf z8Lq@$dGLJ8+nKrlH+(mH_^CWiV}rz-NXBG zT*}AN;*Oof;AvPW4(0laO-h_CDE+c6WeB|D-Jl?5pqeKJ=+96g6%1GqV{fz+@?-I9 zB;SBSWBMWK{%&0AlTO%u&5A?B6F^M245Y+bj0xHEg&zt6u!?QJlzjaPiI(7xXt$VE zh@e&ZF^2SL-g?IHtwy3t{@LU_$j=cA#l_$)xl=>{3@PkVH{D2dW31f%rF+!@1ytc=lc>9(lpjnMoFs-hJgAspZNe`{ z&5>d^N;S1D9dZ2y2-3Kq-Iumy|K6G^C0@&}+7qHY@drmcWXO%`aAjcVTlv?wj_4{y zp-f-H*6m-7!I*umk1@-`%;_JhHPj{|Wvt4igBXANT?*4QGnePGH$WP4V4Vzoq55${ zhkxechLNk^;F9?|bHl)XHCdDq88-kx%fKqY;-u$u9(ETJ-v`(9sgf*xj1CbQqk3Gz z?Q_H4Zi8V>NoP2Ft~2N!?!J@f=i5X8so87 z9oxBfu`nG2jb$6<->16%eeCdn6#UCxC}BsBnu*uaZQAR3mcKGw`S2{1s#!(VQ&dSi z^)I(>Jk7K>IY$$3DCO)(DkaA^OE_%n4{VZh=W?{Ie3rv zxhpm3|5;K4dA6_vbw%5QXEw+pr&BwBdMbDJrZc1zcn#o9(8lda;1_)jMP;Z54FLX) zI#hRpVbkP}WW#*RG()ltvqvAsa^p!$bfWp3Xkp17~Rh{B@Z*~1GXk`D^ zGUQgsz9_U0v{KTZ5H|g@{)&}A$2l~?^%bNq_2f6u>~VZ5Ot)mtZVwlqe3q)dG-~^+ zcKs+WTmir-Q!oELGduk0h2#)OS$`er>OfK*X9SZ(j^hc}PEw$5WM zq3YLnC*slZ7M6zEoRwhpkV37blRG9-6{w%zDt{4@jTf$rG8EE;cf6{T9Vbl88j#vw z{2iZ}P&4wEvbBnL0SKNmXJWl1G6IL5>;htxQ6dU>(BpNMR(NBFiNtZ$-7PB7PKYj? z=|xem`>Hmle+vlA58yq#h1+RyBVXpp&2H>YfLlmRSh)OcbqrCpgI|) zB2kpv@365S-FlJ-B3kQWO_girR^+|eiw3c4`2B5kp{rU~@6!@O9!osb2SeQJ;TRPr zy9rJ+gW zs=p?M*M7qEu|QA`iAbvrJ+B@yB|5a;S47xtemkhJLO6uaw!IpdT&DL^JV1M;w;cj8A((B+c{5d=J8oR4bT#^4n(LQ42J5d;B#Jg zWeUXRG^UotK+jBGz%)Z@xm+TyMOcBw5i+g@*&O z#E$(!MtJ!fyCd=i6Z7tehy$TDeRzND)}1?!T_MYf<(Gth`O+c_`@(hjY9!dt%_A$> zN?deIOX&il+d3k}yAf58VvmyfDhSG=L(D#eOSr7<~O91o(%$&}5BcG;~0; zwr2+uFdw2IawtIIuPKB=^kIH=OvZ76fls#R%R(iXP%x}`9IKvY$%3o_c%HnKE)+U3 z?0DLkJ!t!7p<+3S;rYw+B|xcl!&ODxC@)!C*Z|S}Q1!)Flx#pBbCek;fmjO00cMPA zWKj+A2T81i9!dOLsKfw)>*ia>FBTry_$ZeQe*TzTx7md8AwB76W;f122AYO*)$BOC zqoXDKw|Dm7%Q^*8pHbk-X&I}QFXdGxBqwo@l>h0)uMpAvCF)%(BtK1E4l^aRpjII& zvlu%kI4<6Wvdg>hn|Qn~V+ewn@A6l9=y|^bMWgWy+M{k|9;Un{2pvqG>I}hrZ`|Mx z%49L*-6$FU&=SJzcc^7)zne4ss#d<5cV))*7QDh~G%QyQ`k7HP7~Jr12T4t>Y=#WD zp&^tcJV<16nn)S>h#{?%>)QFP@`q2(G3N6XIcN<%zNEt9JV3jj$PPW=jQxk~x~cUCz|nL; z^#=j>)&=(m!<5oNrHs1CB4ZYOXKo@YnpJI@`gJ~&)4cFTVXWA%qXKEnq}=1C-_*{V z3TQTid7@?UgqPz)q2_nW;DoZ`-BMZix@KgTbS3Z|tz7_MGr8T}ju$ckf9m8p(8s1H z1caQ--ZLSjm%`CJAx&Qfv4PG*mtgy3hE;?>aJFSLyZRMU z6})2Qnrf5RRRj%bY$IB;DycN$o|Y-}8~wU!M`9UgHW2?Q)OIkZd4 zYakLx#O0%@uGl{V=ez=Q@fnxRh=v%SV5(J&yD3whL2zAA0(=BJ`In?$!jZTmk?7QJ zUaaqCZ&Og&q=W52DrK2Fs-`u7@95M9cviJx!@GPlJlDCGspp&!d5ree6~3*Ula(w* zntV#xg#TfR`gQyVt z=pKpU=z%x!WKE2RK6rPEw;GjhIKPCp6`Yj*dYo&}sksxpFR_G8xk;O_wm>+wK@>rT zvjhwJCNyR3&tyjDfE&?dZa$~Ujh73$Lrf;s+UB{UQxU~LU;+6m4OJ=7L|e#ZLu3DMjlFeZ(NX~q(2&Xw$LqUo!k1|{dJ6d{%x-!Z{ghow|O{JSu}UoftnLn#gzo=1aL|`<@%m?IhoS8fodp7rZPP-cbccr5_VI3kbA_kq2hkHXe&${MG6OgELH-C~?A8F}h zF{VK1=lZG^kcs6;7Ah>`FQaUps(dF!6#Km7XG*2ZmgKEUzbC*TBv)bF10Nlj!Ap_F zp}-5Sq zTFU^azL_WmpGtiIIxl3-IZxf+GZOhpIzT=u7B~P;EGvP?lG+a52BM_s3~K`dIP1~) z&7UdaG}WO+v-Ds$1suPzzx!2AiL;z?WA7^C58q*%!tWl%X;J8O{Ei8{?wS-S%#TV9 zSoDWNE=iuxrJPqiMOtmWb@B$_-x3EOUtMq9*p{c*MBI(tDY>tzS*-cSG!1wk#AplU z$gd9E6KX4ZGVP>p9cG-6K4E21$g?jDOFV6cWlz@UUk>cn0=9Z%%%e`HvRZ5E_@&>c zy_EmtF0#KA1^c27-T&rLg4BHdJ!PT=WbbgS5Gex!f+%ZObc-P$!o?DJn{#2LcneUf z1n*2IVy+;6_^%c~+c)n3MzO$H3K(^CQ+EQW1=4a`#J3nrs7l4-Bo4@K+tA{J_Ju#w zz0|Z;zV0R<+66sm^|4GnZXlj{)zQsv-?f?T>6-n~>7hd6A6XxX2gC-?)ZaOqBC0cU zOMf#5R1Qd|mnYnmf-|{y(z(z3n0!xoq^go}G`t9dDEX+~9y2r~ zQye6nQMCTI8Uil}JRtvB7y8fh|5xj7zuIaY;h_O*PRT?>jFoh=;tK{`QrfhUMfa|1 z!_7l+Q>?9#Iqf*Vg!ktohL}Oh*^5_acxzm(Ry}($V2O$78+SoaukOdkQ`gw`h}rdG zCA-~xm>=Npbi10&LSFn?z{NA83@2CJN`10W6~^sKowUYd%tuF`PLM5C#k6>~r9i%} zd2?9Re5=q3Q&E`TdjW~R4CX3UNrtIMpGFeiirsL6|4X70{O_8>$nQ>{oX&K+e3zut&+3Hf;w8QWJhHfLe55c)% z*e8`%xHlZZbS_^&E0F+*ifGPiRnkvtn>qR2wH z*|gEU0YBaXs~VLYO;|xH164#2i#+EuBk_4;>KXcYZyX?NZ9r%vx*Faoy_UOC3+co> zZ)Q`DzlQ$uA;Gn>s zZ@d`Ioj4oG){w~Tm%KfzULpyNGoNq~_0A-^0ee}Ad*c3L7-?v1hMa*vrMJaf>2vOD zt0Ov+YKmxx@A;75jY^sGy1c%;XNculO5XVM^I2>so#X|8w-l2CANshikD&7~H_#Mx zimA8#?`N4N%J|XKVo&ryq40W@TOO1RXSv6pd|Ahs%2)Oh<3u6)U2>$G@#Na%5LA4& zdS%P9dXs?~V9OoZJU{c-i4Qmp1Rj(?u!R+X^H$h{UsUkRC_mp}zeCa+*0#-Jyynr4 zFn@g|!O=VqD$;<}DhW>r1r45xUt~DZqm6cW*eNOVK(53$o3F`PA}pKMin?d-GP#ed zNhXX4B?-jXcB<3K&LCTxuUeXBpyG8&@dG#RRYJ{S=B}8zg}jU2o;EIlS2yhpf^UcAxir z3-jp{7?2>Xue`Cq7NfFPm=v@_HF%qm(2NbgHqrUG@#{ z`-z3TDIJ??=l6Vt!R+3z-<;SdFMnBNCSzER3imZR*kqJ@yFoEhd1m9rVpfESIeM!p z(y3>NOUFRk6>2QBb|)Pn+e1oOy@(t#0w*fEOZg_IKCprBDyG7WiBz5(BUfdwIV?dP%#fsA^~_cLzxc9Ts$B+*h>*za&{V}lzoV{GvXOH!{&ZH<(mFLRl3-XkgK z*+Uy5Dt4X#y8oGY(-E4rE?oFeX@M0&bXb7D{Z#AuxqaZ1dw(WS|y?hRh8 zVw<6U$TO65l(8Y@c;WSP#>LWfkSn|{Yq{D3aRD~?mZgjhwKit|>xR_R7`9mx9pOFmdOY-}Oi|6=bumK=wfG#`iudUq_*ieB{O zjaKyDKm9^IbDNF5{d<~`tUKC3>OfoITksU<4!-6^B zK~I%%BKWjeQ0bJnY=19?gox-%nZW5(VVj}}k^7NJ>78Z5-+GMCe!EX({e>sIr(alq z=MEE4m7L6z{HIaI^xFH@V+$kuMtmc=%t3xVAGX1;bOt8c!4TJbLMDo5(bn#M-i*Y& zDm}0C{`5nGBwVa>GSyGT2$J;C?wrQU%^^53;e_7a`|8w1U5XLJ)c283oiQ1LXdk&Q z4Q9Lgh`@E`v--8Jg^w&C%+b^U7h+${dG0=0e@?6Cnb4U{y2oid*V8^B@*)^GDSs2~ zoPbDkp{I{yXg#iCO(A|u9vYwk#z!UAj9<=hntD}dv^glpdf(_mAL7sX_vN-N)3&VR z;>x751SI1$I3@ri{^KSZVI8@F%+XxZ1>;og3u$fZREY3+Uq#YzCY`u(NCU|dehFBY ztxI8m#%m;R*A9WVsJ->@z9@;ia|b0PeHf6A#o6nEu}zieZ@g4EX~6F0Oi#W`lctrq z!aE@aSZX!1yzZ5U5DBeOg;Nl+po#;bW^jDj;+L~{hF-%ZLb~zGAK#7ZzyckmiL+dX z-o^sskI>U0Yz&h2)Gm1QwdPiHXmoP#X&%+F2-^=4z^hvP!8{KTz7&9}F6H940Qog} zjzh&nw2?N0Va`k8XKAU8(^x`}of3EIw8jB|rb0w+A<&8R_qG|xeyyy5Ku;ZT$f^Nt zz0xLHx%6rr2}arH$JSt8mg?C&7wCeylHz5-Onlww@%rdFqPS7h2w{Iv82fV-1u-QK z+coPoLHLcURJNIM6a;ZJd%r!-vk|M44CT93P8R8YBY%CJawYeWzNs?1#g#J?rAqM_ z$!K2^P+D&ea_}tInZFz|UMSQ(Ua*OuCJgwGD_^y$dFZE5U}>?_w7Klr-=t~1DWC}Q zztusIqCNE~mIq;l#%E+|H$1TXN^RKL#L^0{9Zo*KBL#Q6(NvxnOyquO)?}0fXbm{E zhEVsPMZ9Vsj9#|(-`&u(`%*b>gyo3PB^vzc2j^dSibz zLLS&|KA{27OjXlDe=OPeC811x)0dgnowEpN7GWlb-V$&jh+Qw5w4sv*k+$n2Cc?jn z=NS}_qw*C6d^XUgh!t~T{_<6YL|Vuie)+_S2C~DdD|${*MbFUQ`+fD>x9tfIzQI`< z2*x3B`Ft3Fkq^-@WJnn<2p|>Xz%n0x;=@Ehj87TU6!O8V4&60Gq9@b**uzaffkM=u z5K6eS%4z2&3JMIM`ltscJS6=3qU@G4A=SoRt*~o}v1LhMPT*c>%Kjx>B$#0C%Brm5=y)GI)db&?OYDKT%d z$A|;8m-ND2i_XMjbyKgo_pAO>bl;L5nYZ;vYtUcht;}-)UqNiM2WPV#T3^sfUX$dq z1{EssxOYtg-BhW1oHaSmeMmV#JsDkD*UX{}{*)*8dm&u5;W^8vMEb(TSTJ4QNhAo`3 z%WCq7_(7S7%qTWhAZ3k%p(&GR_9wC&@~~gfB%3$Kn+`sL)R}0w=`Pn8S=|b~y)jDk z!=9(G7?QI5a`39DEXVwX`SQxXdGYO=jGv2PPIknH6Vw^p`OMA5t-MMjM*nROFKCUG z2{a;uo`X3kPNjN^mUzG)cEA@Jg199Z+P&m7$d6YNAfI==(aEnermkOkC5ysrk5b-8 zl`jR+S~#x9ilV7U=Wo8@s{VVr!EPko2UhO#f3+#v-&YrNzdRx2FI~tlYele|?=T1i|=N_)X88=$R;~4Rj(hB=n4+t?@M2!%fS{x8@kl zsiZd{_zOQQn*OCx)Xx;gE&l+Wi~Ok(HN#O`9_CFsg8}#h^+#$cIRX}{37K)u)ZR)vA0%<1CRSb&2V{E^l zJ`mRIgHA7LGEFV5j>D#X z-v#&5(nr%0+{=uI*M$B>#0w)NLde&eM^vLH&U^p3o;Z}XW=U)*`<2hl5^RO z8|N>9;U09Y{c$X)aP@T{n(6|EsCz7JMZ3#}lf2|2T1znL5>tcfQ)jvTqVZ0uu>^Dt zy=8Y3FMj5`du(!#fBJhb_(xWi*sj+54D?gIEvj=CB9y!tRfmqr{$?+9=Fbu~_Cyq- zVmm45j(Yc*t?wSRz##6xin0dnA@FB8!%cI7R_YH!MAnir+XnuV3YhswMy*{X-%anH z_T8uobh0Uoc=D5Hb&HU4g1StO^8-g=wN9xE6nh+x8kXpjl@>47*ezp4vM9ER3UyxJ zjqp+$>Zyp_By}ON5zqJ=t6-Z#HqCYE0AEuM-Dve*iD*fXm3AZ(-_iiDKK6MA?7_|U z=L8~hwl8~}-*x4Ce}6ul9^ZrILUUI##ebeFn91s#zPkIRkPIl+)0+kJJ^2)>Tw`4I z% zz7CBup#rc2r?t+VG&M;V+qqfj(*qodr(}>c)YI+F7K3Dnjvku!vP9)&z21zD=(izi zye3_aqXx#gT(`YXHj;mCom>6{!Iyt)CpN0!t!kM1CNYRpY~UEb-YD(c5%y3?v=mlo zSS#VTs0pDrs)|~-nN9I*V+y^m@B$Lf;eh2$14G#0n^_>=lKAtv%1XZQet4PMQ~t%c z^@lJ9FcRh|8=QOg<^%`2%*zCz#@~8K#!$Ne=m%^ogtwpgPFJg_w79ba=fJo(L3P3B z_AQjm>LBgLOmzrGU_|Q0aV|+5Xicy&@R={#6|_u!%)vK23mW15@AwBJxceyJfY|rlvGE=3qpkF&N;$@0AE*rp79E!- z3cYJ=?|}Im;Xk>a-B?INpYGgIWX(()+`P!6@!h;H2?LOsN|8x?H&P=jasea54$+}f z*f$MA`mG?0+(OX>I(5JXBOrq3LNm8(eKj<^q1zmtAQn|+mZy6nb&)w#MUI3xUc`1e z){B4{dFM+((iyuq`L4tAZ1ycHTYa-?!u#4dQ~weUh)l;HudR-p<(w{ds2ICKum|e% zz(;)~(tkxC)X%*xyb6Ba|GrGlv>g=s!_Nm!6iAcLQTGobVH`I!>#L0!BcT>*8*NWk z91a86OCX4DcNkLB2xP+q9%VkulswG*r3@ob^D0h^ZSnmCi5fzC9U9svwo}qY;Exkf z0Ett@9aM}Fx0(L?BZr81;E^VB*wq=J+6YfKu2)R~7|C5SdQPka?#g}U9ffCHkmPCM z?D0Al{|TCo-}~-0DFDBLcq%q(bAjBJhgJtnI z$KNGL+s!);-Z$RJ5Nf9DZYgrOTZBL<90ukb7~3ok+G#_~mhNiuf;gMG9SHk_bG&7Cjs@}}+1z!L*F$e4WW9KsQWkSQ z1&I^NlwEG$bTn|LulVA$NQcvj80xNN4=*_UvUodop5H?6aPI0+Q3L2mUP&?savbce zb+8gAPu&$A!}_I*9}b-^2`Pwcz;W4Vr&hkLy@y&9c4JB2TdAhTdTTavk_rwWNV!yY zNIX4`Sk|9rDEEv&g6?;QlL9zVi?_~3AYvKzPdjatd zy;aGo0EGqCJ*ZT>l=zJD98nwwi+l6aEyr3m5lp|zYxjtNWjKeoe4{|${DQ(o!c`>2 z>IC(b>m^^H6EGCn|AD?I3M|RezC(vF4lW#9Qb>wFmpncr4;M5FU7}c8AE|(+kn;^LeFS^aLfwMk^Y+-+JfFZ9_QR zXvTeTpfQn#MXn;V0IgDLm5gnjrLf0E<1nfNgvE zB4`=S_OkE3$dnpJ;6TY^T|jhZNTUuOv0M^AIS1Vbk)<(vCqb}Q>sqB2df4K%gd*#6 z<7dhUM`aOzx;IqTDH8>P(OmjP4IUzi1$eR9<)_3 z=aT--04n#DDE6sk9Y0f)G$6(j@BL}%Hzc2X$V6EdfAMMs_;$Iyj*X~_Yd{Yy0L_Y{ zjv*{px#RgQaQ#$b!KzL$v2XMmnv|%3?y8>2O`d<71yiB~@lRUV9rg4Pe*QLo!iICv z%A_&>J}wX1hN&0kQH57j_99~+7<~o+A8zcG@~$C?8O_%a4rzzs6|Q_ zi=7;CgJQbvts0k8h!>#2;7caHjGqkF0)~FDxj;yyU-;NQXu|FqMMbd^=ngKljUx2U zd-T-H)~YuGoQXwBi~~<-CXtGJNq>xy&6g}f@#IwQ)96(22JLuPR_sTfT94$_Cyin_ zBXr$!XPDpvX1~esM}7@RxWAdZv#(MLtSPeyg;^&u|4v9&4x(eymAbr8eLvl#=v=I~ z264KEDmpxfJ{kkU-32;08UgAAYvHPK2L8Mub^AC9EaX^qFUGWuQok8OlZjh*(qTV| zE>Jd5A99@yl`Nj)KAb)H#%8!k7NLi97jQ|qp=6=)Sn37huPFW{U2C&$QWQDHqppwI z77fP*HnodqyxlBC%_!-BKptEmCv#9sRQtQOika?x@RGy1aV@d5D$@t?(|C(2tbXlt z!Wz~p>sTP9m9sgm^Ev_S(H4>3d-IK4uUt$ur!ebU3C)=rJ@$@ZF^s$8deR=fP<2Lc z_T;+?m*MOoE^KJxNro(tzpy*PYhF+0l(2JpV|_(scn6G6K^$H+Bo4FlTfp60l-ATc zeek;3B61>NgB40AVq>ItLqgk0#4y}7M0PK}yX4F-BpUo`{cY6*4Up(g?2=Q4IL&FA6weX8>0V;>ChqrX!Ax7L6J`&) zeVIt!$ei0*ADL~Sh9_QRNMHc4+05snP=o4Uh@~ z{vjd`$!3rGeS5m)jK~z#k~YFa35MWI&?kC78Ws3pboqT>l))Hjy6%g>5B`jh*RnkhDH*XDQoRZGQ&*vdvmYdbO8t64uKoV%u}L$m!%gbSalZ|GAK)cF zp8|YyJhHHcg&8H5=HY5M$V1$P@m_$+-9~Ufub^6EEdcy?EN1d_=;I3#urOD*(sQD@ zsmLz)*%@@EYH#2ak0(U@^&p-rY~nL-3Z4;z-(Igcu$qu)mT+)RlP97}k0Z^T213zx%qG%n@SWSUG}}$W|s@O2EOBgRIE;1FqH}Mn^mO(7opWcxuhHkWr0j( z4q4`GcLik5R@bXhsr$m|Jv+X!Ik0Q~rpVdLh5vZze^=K1|9QRK3o(~+NT}r>?u={- z8S<4w5`b%@&m0Lo;MyPv#wd8LU=xc*g5dxht+_D$*||%|@-5~HAR6QMI1XJdq(Svr zh<@R!YBoZ_ry4TJrOF-r8CCMpqms^anQ>a58J&G@P?vBu;$VtVI8|FH<~myUV3$oMsi-}uHx=yd=)t+|L@ zWp*vu%V^`gW_CNWVB5W#_GH1Y42Hj5y!gb{#PAkUDR176^I`)?fG+~!9`0(i*Jh(Q z5m5O=IYLS8%F;UbKt^r8t5DyZ^7WYgjF`Nsl3u?9Rl%6#q4orP{@wj55nGYda%I(Y z<>+wy+Y(nao=b*qk;ln|7dIK!MMBfTUM`j$-Y%n;KtN$CFfhfL_>6vF^YJx^6$Rdw z!Wa`PFP%}bqfUtM5i9L1fPY2R8>Qlx%4De}Pmj8|pI6OW`~htn!j!m9HYc%h^^a-PfS011IX~RP)|sk!i{!$pUR7&EO5)|OatzJi3!@_ zmmlOjY8zPa$^gEr1m3b42p_Ua5Ihf)CLxfL!YcKJZdEWbq0gBT6GF+}Q4fTJz+RN{ z*Ne!G%|Mf<{#To}C)N}*@tr{S#U%P|x)fe}H+lbwZSR3CeYnjZQd4_M4&QZ~P^yic z35f|@@EA*4OuZ~RiJw((ywJq&<_yc?j#ofPX$FYAJQ+HG-+?(eUsTEiNgSWWna)nb zeKq+K(_tIbKw+K_D+;(r2`}kiW>@QaAT6ZbzK5lUU}32tPAVVelVZ3Ks{;9QAvFXI z@Wp}}-$7cqPqIqC>u-r}CuME_%I--m~=+)Q}e;B81=|MI|;SXKT( zRk>yGW+fV-BH?ej&k7Wj#K@G(lvce>|JFWnSP#o-$i5MvVWy#i9>zZ@H%eYn;`02I zcO$zbc9JJlF3RyIxPx00ELM~bBy5h8zK*|MB+@I;9+@K`OX#^J!YY|Z=1mQx%AN>m zB>d1zJ<^CU)dlj6?r@t4&+eM4LQ9|=(XH=lS905H6A>)x=1q@Z_)eh$@s7G^-7=c8 zIVel!{lAtNYIu0T)#NxWS6{6W&whR_CjY~n`quM|25cU%}G9<}V%{O}T+ zNv?ZluYvD<2?4*EX0=dW-8Dnq^i}I5QY>_JSLgA2iYAf2Zu@>a%}BL+Gdqj=@s-zW zsjh&#cCH`@ZI`R6SIa+{N!v#>`lMms<~c7$sc2`6R;!Xy5Ai+vbDpSWd{1}V z!pd6y@@=YV^&fg%_CE%dm&1w3@RSIl4}`Ge@m=f^!+vS?JmLFH8&8_ z{!R=tcu2C+K`_DN_^aLyOqqiFCv<0+MZu z^?kw0o(2KF`_;gW+Ke(Zt>tqY?NMw?-!NgULWKFUlFna5Lf^zD3WVe&u^X`=*oT0& z8o76DZ1p}}pSFjg9bMM0^y)Y{RUhg^%54Xz1S*hqxaVQ$)e&K=IwOG+uio)etD>q_ z&ge5&V+Y#eC7u9OPws50@Sf~O)IRh?PJQnFdFwLtra5#SH<^olQ-yX3>&pg0DMOvb zIh)zy5vnB%*38tTQ-dW1fbDw+jmhpJu_#9>0lsPuc__CzR$CMf-J3mYJz>?!tDMSQ zycV22Q+%~0O(gn!2i5!S7{A=KwBH0_ccvG8YSJB)Pa~>yr@Btvk=v%o!~kzyVNI5F zTnoCmW85f{^(|EGoFcngFF4gceHq5}SMlTLx1}?7ObZ04OGic%i6IGY0&RS435^g9 zgN58!dXc6Oo5O}wa6A}8Z^JXAWrkeS$-8j-6+57UZ}55%vn)#(j|rpOBmMoYGY_wi zSC8TLiI##}aOav*^YCS)SrR6Dhl0+oBpQ&^`N|G&@jQk4EO zVMXV2Kd!U4;7b2MjEH}VQEnn59hg`C4b?zI_OIaeujW*ESwxGnBkMCxD3X8eiuE{P zc&&7{H)_7xLsJa(+ZG~yxb!U2J<}g)rMT&RUKgB0y!?%?l)ymj?0-Z#N1>L9E%fT@ zEFX&ayezi&ve5TNGVj)jNWcI;1cI8Rtetanq=43m8sVA#=$S87RkoepY@yin`65i*h|*>bt}k~dWS z?x-{(C@-3D89SL0EW_5o>}&vIfn#~Ll2H}OjG?=Q{*sV&y`>4d$Iq+$B$c7IE_wLx zKkGEYI|RNX%e>;pkZI-CI8QiL-)X#;rEd4l^3Mf{m&slFyy{jx`$3~&K%fRbx7-i4f9H1i}|@w{!hK zqKu7EEVdx43>732CIq~Y<{>|t6{l5AB0NiWQpYWQQ zw)VE1F%tCt>Mzo85tZ1|>cZct4PMN+4VScfHxL2ZW-Xb&?^qIT z!@=0V=&Z0m*AAV~I|Vv{kWs8A5ZpJ8tvwoiVaQp9!*zjLlwe|;({+XDNY?kfcIaDu zfA)0S9$%+U(;5sa*|W(E{hhWRTKY{u$GtE)3nP-goAns_ouWs3Q}BJ>xIj31sn~V9 zS5Qxtj3~Aj#6SZ7o2R-6mj7e&vS%dKelRHgqx*RS>df=^z^f5R$OIQ?S`C+*+9AT@ zj);Tv=hFQ;(4j00GOH|BB8N5cPjy=tm$?3*${haklmp%%i?2Ho%7TF$x(jMp!nV6d zs}yUUV)9Z{3;yaWk(497+}82<7Q}(;`g0Uir7S{a#3Xau7tK)kylBIIv{W|%-GOQE zo1{kjEP-Qy(>G*6dqohi$Zn%?ygBKM@E=y$I332do7z&`BX09*j?MxR`G+#Q=QGt{ zA(bWJ*62=TMf6NyPY*KiT6T49t6a%S+)cY?M@<+B@IUt*G_E!3JEK^2+su_bPfi+U{-Tk+r)??W1D_{t3uu7}GeD#pHPmfDtLO{%%-^Tw#;5Y?1M4^0O9WK~h>UcVWI-@1`Q)xGbyEbyOP)i{$t2Fwi=N1>lY z;fWrl-JCb)9)+;_X;G7Gw)d~kcJ1Se6B!X_wMTY$I>et*t|ViWm<@kP#ynP*fU4nY z7Q{qhI${DKV7;c7c<_!SB#D)P&L1{XUg;kCzC)3r`J%-6GlZJwS_tfybo-VC(7J_9 z`ZX2sk83cHGn5Z8lkhz3(<3%MQy4+njw*RKFh+}2(R#6 zh(Jw@vnIb39Z%=CTfls1bUXMLUH zdkD+PJoLE}*HeD+T58dH1>QXnt~SZWC^gn~-rdto2<6W9l#lLqPdksiPqZ+~7uo}# zHY0D?&qOAS{p&jE4i*B>b;s!LyIR-DIZrhvec8|!@dD;-!O7rhPe#|`P2OsQPoi@+ ziRETMmqIWt6PB+TM;xZt_YwMI-QD7s6vLfk66R$#>w9~c)$_#1n*9Bc-kbV&T`gQc zA;p)Bz;0!`9dZfW=o!8%v^l4Q!dC_Im*!&x-?cq08g8NY^jx=R*I8vZ>c`Viw)8<(iqSLt z;sN3CsKi%^o{)w}Dpw=V9qUhSC>_FUQ&Z9-60t z_A6R-eBJY!gFP^CvHVbrH5s#pIpjC8IF__TS%St%BKYMszxL?w#0!7u4_j4L27diW z1=xVJ&W`)hm{*-W^SO|qTjcL*R0$OMgq=ko>ip3geLeIm$s5nvCw=7tYSB=@{kXkk zT|eU1!zK&s+2p2sip-|Y++aag#pw~!V+?nGI<9hCV!A8GdvB95ZU2fYvVY|N&eZ;= z_i#Thal+ECa^@dTWQA(g)G3PL!roO{`yu|$@y^C+i!g1n9_&z5?j$s3pPTQ2>&=|6$A*Vst zMOdcc;_tENrQY@@K)08y7?z>l*JZz-{q!9h9&DHqza_-=VO_GvLQwerg?KhY%^Qvj zNDS7nA4;w~=W19}`AX+}MDdCJ?T-?QVfVY81$svC1oTP^>CHN}#HbKIMVqy<7P16J z%ET^(LOrmH6`)xmwB#>=DukslFKGy$L61%VKZ#Bn-l|odVhU?o1w^l}jkr&MTz2pIK z%-e%xHfIb-0zPeaS-=k8Jous%w&tMkWZEkB@lFz~#=XCNGeH=Nk6Vk~5gT69ZZ!Tm zDmJsk7-Oq-x1?<=A3(xHiY(B6xQ344c5bbkf|M>TJGqKrShcdhWX77qoe1=+()W^I zN#J+Mbp_~>e(ZV8bU^@yBl%P7dHh@0?ZK~r0R48PnO;a1j|Idd5e_6jyp=hmuUpL#Et^Se~4;^4$AxxMsni9j=cq_NCrile!@q&94Zn2Y6 zCIBT_b?Cpz+TQEKU%|jlD3_aO$JS!%nN9Nabs)4p>}!$X*Fr*=_=+uMv@RNsSJd_X zs5Eu`lqLpBNe=NLn=)NOBB$v0I-Zu+7!8?K3jUnm*kUh3EC(I1YN53AV6J(W{T3fd zrWeHsa**jm0{={+p|&DraxvomicV6l^m9 z+)J7mvTeYdIQ*?IB4Q$lKOim+XtmKI;12?HyyQPd4v%oJ=Q`xd`TT* z*$ecbwaR;j*&*r4KwaYP-SfG$Df0(;Vua)jki48-8xULy=_bGy8RjwJ)-3(i=~ldlVg3RC*NGdjMaLPHrsQ3Zhkb$241MBvyDR5lv;z44Hu0!%WY zgUX@yHy2(H=L*w;WWcPweyy`SLzt9g8N{b#>IO^|Pxde8PXC6B|4FJ)IKW@Z0>^gK zUnN%P#uIS;&?wJhiSjZ4c?FPx`h3- zaS8ddVe+lj*1vYLU}}gwxFg_*1n1!jaMw6pSTJ`Tkd#?m|4TW>{8j$%`Drb~TnrF| zxEQMt;1wL>ZvdZl!8th-j!U{YQi}$Cm4Kg$2RKdB3OQgQZHXlG&@R7280fcJUSL8k zU{)9z&~JQ2l+~|4wfR6Ga2>p_!96U)J4(YiQ6Chm!rAegHX$y;B#7sz9(6TZ!~KhM zI6hWDTd(Ne>X1$EMq^5!oxCY-K9!250xI&|^x0f8I{J2x;ZFVo#CM{Xc1~T8lU4W> zl71a1jUkyu*;#Gnoqm!W&dJCs>-gmE`YkG1P&zR-&=BumyLc=lZBq$! zj7)3T4ylH^dcfDjzyM0tNkea-N#^%^n(PRYe)*pt&yxI05s)T;JO0Ghm0|R86ZYuP zx|Xrw_=3{`PE(jrSjbci`NwyEA4?uiI6a?v?KWbDUO?(^Mz9}$2zqZMyP}q33HW(1 z4rGgCKZb4dC9P%y?{2PT#k4B!*v<$A{rp;As$tF8QDaJ>=J}kbGi(xSw@Me%>ySK?Q z0WwL>LIISsLt({V6pS8^^tR)b=Ge$A-{E<~~p})kc z{&ZF5;Vhn9?IngprXF-i<`jZPq^GG6U&4A0W0s6xhPZ2;jbd~CV)~4B9_*`8ud;Kt z1p4*}GgEcS_kAeD+;(!@5(gCFMj#&Lk_Q8B92ouu`j*c-5zzG;uOxD_c=#$HDaEHF zZO)3Q_qU=f5{zI}TYr00I~!uy=z=&(zMqf3MqE;lm3D?2#(j)nn>!dbgunO$nfvw| zG2ao$Fh)4Tb^YZAgbVSIhVx|n!0Q;q_@Yl-$lHf03L$r)^Ok8Pr;fBx4$kPte!zJs zEU>L2I&|jl{(aE>eH<(|AJ=kK#QVhm2FWkAb@$NDj3U4wSOAQ3?gY{ay=Rm%T+W=7 zJwq$TuVzN|<|g-v9FhIbn@!&-sgy`E&`??-C8l{DDs!I2dyeylJnPY3{8=QpYfGi7=bUjN`)-=+pjP zZZW_V)eG6Ffme7SZW#J6l%8-(Kj1e;TmYU$8Ag>JP-V0HFdMGGhch2wzVQ70!}EW8 zZ)*$x{>L2^SzgD4!i)R`)H|8od+q0BB0>~)H={}H$S>d{S9Usi>}ld=TLmB{O-xFIR zLDD5KTAf+-oYYh=Ey&D>hVd^ymf@&*KBulWqbf6t4OpM4c z4-tpLiOG#>8Q$ogTXFCMFq3{LD5%P6m&|qx z+Z7rSD=B1I@+uxVWG(&Q;O6=xXTec%T+XdM<~xl4EC}ODD!GqAB3*UjASOKo1nAV=NV(9U$9 z;L0);z!9oeRU&fLFRu?rY{d3FO=>dkfR)5TJ&kTBf|?0L6uyXrPe;Of{aYOzCG})= z)#D6iHlZ`>Ea40cG5nlAEmQ5lxfDF`jCrC<@A`m+eMx$Xt)Vsv#l&9A+(&nh$MP9g zlLM6j2Pna_jqtf1e>|B<6QpVJgYkI2jQScuQ}A?es9Km^g>MP!ZGS6Jz2%-|~} zaYQgh2}>7e$w3}UW(VkxC2CSSG|;`IxY9-|w<6qM;qfVBLxCi{CBSn(#v95Z4+}HQ zb}Q=eqp~|3GmtQsQc1LdRdLLoQWp{%ChGcIhVm{DSnEnl_XcYlUKzkwrq#p-dv0tJ zgDKxPUEL#IC5*kW-x8C6Cr}87`NQ!BXu;@84gxAfpdV~UNy~GaXotJozvwkSGw=Xe zc>Uci+lZ4#D9^W4Vf&XOnwTIJ`@~9F=gLZy{qKd$tg zePDd%&kQ|R?o6D+cB)tAz(*P3X`D)r#ZfAhK7(JY-vthE9n}2r68O*}syeD_-8VC2 zAwo?r{*aXLc3ct}NE$fMzdv_hW!xHpq}}OK%3EnIq<4Dc)N9#qw7;>4UNzMP<1q(T z^J1LxkNr)~%T}$OR*A3Dh?f<`G@FuAXwz2Ty)?G8V4AL}yXXDY{k!+0f&U{Ei7P2x zg@u&eLR&@#cH}QD7r8d9W#{0F4UoxKe2wfjB9BH@%VX2+TGC_$qHC6^aQKQu3dzHt zjzYx9K0D^~J_fe=; z_hTP0j?D~S1!%RtFX%qz@Io1j8i>AOqM!t_F4s{i{Dh8cPi(l8OU<1K?J03Ypdbz- zTY7I!^?5B#7W(T~`vP@BRPd@LHlafjUelK~g$*B;f>m25J2LwkY-0{QzlBib7a<9H z@x^xY68Mm_B$SIInZ#nou`c@H{jxVDrNU8x*sKEmVMDl#9!xmyr4co{Wz8#o)3y8& z%l5C;4Ic7X1Z(BQ4pCGS<==KxLuywYNiXMeRJrNu)|(Xh-TeI?y{hZ-S9Qwk^;+Oy zI9mu&^YwCSts zR%iVcN$+3#p-Dt+uWAb!DBR^2-v%+Gk#rC9eMS_4_=Iofx(c6wDiz+N<%Ld&dML_N zAd}ni!-#sjvp5~Mymo=uVBGG^B+^V~xnWb^=lS?%&soS9Cd@N_c)IH}e)T8@vpH&a zqi=&j&2jp4i5D~h!h574qPU&Mbu?*{xg_bFr5YMI=kZP_N#3RUB?F+HoY!-kpW%t!jfbh3ORK@m^tC_HU5iC5jSg@xr;G30pzm zpUJstOFsZOw6d^^lRZbcN};~;jA)Wg9@?zyC5*qNy`nR@9_0I(6`YvTaEHwNF$VDG z*8gGeOqN_#f;9a=ESN$NEK?vr%wiThMlp*S#M5_hZ&_JaFUqVJ)vGqU=bp@y5{ba$ z_wOen+&3XKBIIF%IchsCecmRN%?4GHkc$&ZX>hyN0HH*DSCqZihq4+pzqk_-sttbY zM%i^mI_+7w1Ajji~;54nE)T`k?=Yf`Zf#GUOCRtSv(5|jE*j=#c3j>*CHFs3Y5G>kxa%n_%L z3&p2D#BcDm?}lH|h1cWvGlTA8LkC}mf}g;fPmQm!Jr;H% zk1f?CB0IlUiSOZK+(%%urnjXgEAb@$t`V0TBmTL?*u9`0+haStu3Q3g0=GhP4|}X= z!pna*9N5-=k16Yu*oL~&v>p|+RfR4t2j5-3iH;TW)lq)nym1AP9}YB&FSJkjZ)3JT z6bVlEc^EhGnv!a(_Sb6eVed;=?#%$QquHYO$i-r>(8zx*M<%98uCsffh08pFwCb40 zKC4{4O|BvsIcCmTMmU_g4_j|F#O%$28!be;1#S$~!%y$~}S@2%taagay+9Ao4)$FPg|uc9y$G4a1Q3jX=% zYcx=g6bD9(yhJnOY!Kp+Zk04Tw;@EMXWQxhXe15txxOm8+vegFu^*jjOL$G#{c>gJ zL>FY?%%rVid&zrxXn}@TC)@YYt*6p=aU>x6Ib|n3hnri$xegBVuL9UU`Jrrv=NW3J z=|jt=nhm5bM*OqoZU4jHuL%o~){N1=`)a7!qMnx^NHlAO`}e9+X<3!9haiDQ{vVv_Qiw;M=Yn!j8n{Qj#~>tq_VMf(qj+cOj$GChKOi+8vu>z71TCr_?3bfNk)K zyQe8ynAdMdi2s>~fC=c|)QPrZJSqO%l2vk)u_S-*@oIxus@p5}XuB`x%*>3{Y1Y6S zQ^j(TpJ9=M4)Cg&@B`WB7LN!_$E)=u3KvHM5{AXch0hHMRWn-xx#d*%3Cs-ugZYO!--Rztemv=5(d|RjH$h4p(tK8Hc*_p(06yuYp#+HHi zT(KZ}mO+98)y9_udk$Yk>*SY3(RfWx-m*M?gO=K{4|7Y*IOQ&}pKsHQyJSdj(T_fX z^cUkVjcYWnEdYZ<@!Ti^uUhnmx&Y`PI}4S?gs)(oaZxzJcd-fIuB3JNg<|n{0^i7k znkmGB%0JXTYdNE-^uIuYK6fA~Wd*K0%dBNt66 z?vyhk2GdjzvXH#AEkEhDBZW0BvdZ{DN=GNlQa&cE4MR3clSwU}6UJj1b*#f}C0;n?p4DS_`KQ&xV( zHpBGn-Ohll%MAfYop@jNJVNjxA4!IC&_WhIyGBw}^6zHd9fL2$E)U{wGgR_mqbwm@54`(G3;jhRrJXd1vm;j!+$Puz zxn`ACsiNSMpsbJM&6b?coK)cES2~p`LCre8B}Q2_Hshvttb2}bI?+?usy0@mQM?_( zwOjtTfG#TCQ*~~1nVN9_-qNw=*ap!!ph~xPZ;J$O?>5pnf@mLjcf;Q;4$J_NRUIDp zZ~qav1!*`VLnB(km7L$`2T-#oo&KnM*SAeT6h{jLvg1hh&_F@lo~0n<*mL2bovZIN zKZ{t|guIGh?U4l`=jA1HLpQUqGX>h1Yy<=yUKM+o~k2`kC z@Wn-|p?=(8AV|x{OBwvuyETeEP{_o8J*Np_Wj+PE!74x{G3?Wj$`kP%$3rhJij~g1CA{UGwQJak@RoZwng>nIH1sZ1Dww&6lTi3ax?|5p) zKQLD$V_%xg$=^-whb1YDKD5`C(L2x%>2Z5{pa^DDSk3hbC(zmS@@kOP(JTy zeEy-=M9ETIoF|a{#*`!8A~H5>bWa)z=eiJ|7Yb>;HQt#ryeiS7uay%CJhrnB92;q= z->s^~e~9|gaU>oTIBD(!s4r$5L)^d++t4wGv(OH?ye)nr4zC~lp`bSj{Ij{Yee|z)ISr%k@8G(wY`e_hTlz#nwpVANbEoytZN>sW@u2)Lm^^=y}yjq629`MaKmkrtjfW1g(u9O zxqpKpByQ9sBx~@8L>8U@U+}zQ{t#)5o-#__J&bS534KJaOZIyDl4G0%pUi|VE}n-q zptwuir66&4ikYq=w!IwE^bCs2f%L$``IFBwu*E*Nrv2(Kl<>CvLtNOsXO2gVa~T(Koa} z*|)wNSAFLaBaJ?@Tk1+nsuMp{p??@sCK>VOd}y^SnGg*XrVSg9yc0~)dd;{0U294n z@9ep8$v{C;-n?^zHqWsD9zQeI#4mEdQ2HHF<|DMYWo`PG;S^4 z`M&eAq`iuJ|0WfosDz_&a2ttfFoBO-B))qZ4m76VS*~Kij2RY{Z+97~SXhV?*z>!x zD2w&r$f;XVzJ6eGUenUT+#~Fn7>VnDwdAlt1#Q}2-bkTSl8lg?bHa?gEcC4E&!yn} z#=qhO-D@0L`wQUF@XvVIj_H~f|C3rHL1z7d37};-kdwlGgGg_;gx!7cBFrBl@5n1b zU8k!$ScDC1VqX=Ww%(xS(2W|0BV8sA>kwNwPro18y_C!@1av0u2f38hI6`z%5;)aa zYZqtv%=eF6J;}M~3UcCK!#i6`e`h^wBxc_)mNYC8^TggbCAB*i2ALH5VOW?vaQ5P(8RC(MH{%a zn+V15T9a0Mw&>@c(lr#XfvL}^Z6*3Pr zmvt0!`Qk!?Vt7NU<_B|fBm+);eUjJd*YqcqaXt#H&oB`Fy$gYMOX6QPx>a1R(^A}(wdZBL`>@He79 ztZ&yb+|V9(V}^{B?_@x&Y!Im7kAOeZQJUi20Xf!-u_;7$KlWxDDISWjnt)=p+*S{f zZ%M1v&29K|<+IfsuCM8_!E$5;3u~tVJXCJ0Hc>FfKt=XGc+}k^Rfnu$f*3ezO(el1 z=&8KKB@VmRr=qhlQ+s$8K6ckOC+RJ|MS(FY0>dVn=#~<{WON z<}D7H>?io?uJl(>(cm9|Z>ptC-Gi3Cw0Z<7&3*cPMh0N#Fr(i&sNiA<{9NU(9zgm{dHd%I)%ll#ZUh9+S`65z%Cy+Gk*naag<%G$GjZmyC(VY=}c{NCOzc>f)iW zLINihymqz3sfue0dncgeRS5M?f2lRT77k9BXnv?4wSBtZf+NL##RAB%r~EnHCVCfq z86L`LHo17ME9a@so+afid4tnwEKaX=rPr4?b@_SBQV5{)rKO~1Tk`X^0wX_~t=MxW z&A#!2$8>pb@F>O1;_$J*wMHr9VI9F$WCkOr1K}tk9Lu-cuqT4u^@RyU4PV%klY7G5 zH&7$1fREA;_rNFcP}6o?9J)0inEV-WY8O+aBbly~uvj#4rFK2jkTl;RH@Ol;s zbNo+c&7!P9T!_h0iwMl+aQh3(0yK;UdICT0pq(|^E&jgq72D2LQzrT{uaK^*VrPf$ zt7NgJ2L#5gh0-n2A)7syFGoUgbaGNHeHX5R)xrheOKK}dLW`ST+vm&Oe=3pA`kWZD zCO#+SS?km2D`Ig=|EUD)ktbK3+)@Lw;H{U|K|*3Mp*T{+Pnc{D6iFk}%zI3nDrVkf zYwyT5`Q6U6_Df)1Pv^!4seCBdA!{w`w0Oa-gZQq440wRpWuz%VdJ8`zl}>j{y4hXk z=zRq>2QfwPH<4=kJ?rQIKS030Er`F}d=ARdZSlLx*l^Jn80ZYbocB=(d47v(=sUlY zA!e-$?xms$pc+tuJz7b$or>M0cW!E5QgbTIsiiZA1?M2Y%oo(#s*^#!=F3ca4=_tA zOK(OH3a{;YwHgqDJyR_+jcY?)eXJGp9W)h2#=`U=WqaCf$C4KEeX8~P6=XWzZtM|A z6VM)@zXPO_!E(R`szIWdJ9$FM?Da)-q4=uw{1OZ&#Z>Q1 zui6_2vQj@z;DD#^?#2zQU zAa)gm7aHsKmHrK6@^}s+QV`rl!|p{1USaK05z^2_$(SC#qBBwOFS(4mb==AAkU_pF z&r`9i7?U$2xLrL&RTA-Sz1zUt5kE_uARy9wgH3_c9;m0Lr_@x1nFyh#$e18RmsOeVo!lpXddm-Ir=mA5zKcH~E%%9PmDN3@=VZGsCJUb0T3x(I zS=<-?U|~aue`*mymW0PM!qaCi7Ig$2t6qS7bu1J>fn5)FN_4Nmb1TXOBrs(Rgs$M| z35G##x{aB^x*iAPb$n-&o%>#1MNr<~$sy+LRZj9Fq9kFd`+7 zKv@tA4}p8=v-KNnZ$tqz>!LjzKGT3#Ex{XurPp@r4dZv@VDRg?BwII7qM?66G_tuY zh(ohS|DM8UJVb%leU8xYwA1BWOev~7HqrHc#6EIVe_Wl|aX4*N?>(oL*b;3gwJ$MK z6ScuVO@pC@2{ppEFAZOYyDC?SY#AUl>>WFE5m{$I#H96;s|lI>(SjAfkZ>T)uCS-> zgxZUJ4&4)@x^j&zT3niCr9oS2=uC0^2Dz&^Ren)s5Ofnl#j+Ysz)G05KM zp7@4{5#=S5zn=9TEp|-cs{dS+5tMKq8!AHfZgg z3x(f!byG;?@$2iB+E#NIetMaLWR)5p;3R`Lkx%kb9C0obnDDvgHm-?NiHBqYZn?Bo z!h2_RMh3qNorjWOGVk5C{fghMQbW$BOwPY-n%7lPmOr=^ld}4w`v0*?bdyppEVLV;QLDV@<1cTGmAlugOzjjk@qU$O~OxA}B z^2qD(r9kN(Zj>W&cyVp6`ukJRyAO)sS*R6K0=z$&- zS2B57Vw4tc_bx=5x_~Ma0u|^x{YMpG?7iFrr*eA-tuvBLW_mO)hWy*r7%_anCUOJm zSi^Jhf!#}eP*u|#7+3CpU)?FK5uvVE@~mX(fEB6F`Ark);Bi^U$1rW3k`xJ*6zSQ>>08zgZXA81gr-thc> zE$oq#)2_uccaC20rBjq+?Hc_$WCnDAfAC7yF**HR{k64``HaMabdEqCUv;pr+Mv)V zSJVQjX1<-IV>&nkx{q?BD8lmlDNsZ3jq5G4gT?SVlGcB7cdNsWHo$1gooef7NwEs;Op?;$6~Uu%0z8x)*g-BeH+Dmn_J~IQl_~Ud>z+g%@*!NbPMz8Cr zb=>oNAv~HUhqP2~5oY>Tqvk#+J6n46H@1KljX-w_sZVI(g5S^`|JaiP6SZPyi-@bu zxqMSS&VTWF=xFs%`|KU?4MZ-L(RtT8ge$N4_>P9FKzo~JhITZAy64@ou95B+T%ZCJ|syqwA7SNoW$$JBEtx~?_rSL~bC zVgms>Iz8ZFiXa6ht!a!C)supXPhM)g(xw~r;jPJ0_VUJJcQUgMtF8lNywGL{gN@ZL zj!KDQxueTa%!Z1`8zzMx9P#aa7{HseA<8?6+d#f}oX%HHtK0U?jEtl0- zR1#_+6HPm;Y_0J0Y`Avr700 z-L2&Cy)@1w+>Qlh=Q6lY@}42V-jpP9?|_9uE@|eS)%GJp`b-5sgNaD(>Uq^7$`x-U`IP{^6}{pSr!D`qYU>yP zGE`w{9U{7d8TMRc_{0Q@H*1>Oknwm>8%;Ej{dl_xH{5v>Dq`}5}+7oS2j}i z>fT4b<@&fv;(Lk}=wc}w-|q|dXR&%wQdmDPBBlis8X}bf?c@G@Z>&euAfx4yqM*o# z>E9FmQa70n6cgY4sjc_EdYA+D;QrRX`4n^+Si7+=0U*HmE6TMEuu0QZh)~_q zq2acQvg&d$?pfftY3%d}7z0Zzs2#EW=e9rxar}6dr>sKY$9Dllb28rM69&k74%iTv zNYW)!xqYvfAsUP|gjYKzCuZQ7Do6Zq7{(hi1x1{tyyh48t)x9a=Vdq;9&+sH1)^^_ zD4(*4h&WCjbSKn8V;iUzzfS;J(|}@>@AjnVem}Nk<(Ae*zIpLh7V=?Y^ymBAyPS%2 z_^&`C8Tmq7#`g%+c=CtG9(+>PAwvuK6V@;O!o9{syvm7%Wv`78QWfOAbGgqu7>M$w zd@V7y>2+{&aTAcN25+Bmj&(ul4wllMvRv5A@yoKV0`vJOMNit8KTsjd{ltYtpY45V zt#WH|G1q=5*++FJrB}>jn&&Z`X{x927cKti$4LX;HD$_sCzpZ87?M1Lkp{Qs>Wpa} z$7i%2(il`V?) z2>I9N_6OV160r^EU2q1_na0FNoAu>-Gq>^ESi1{3y=Nf3)s#rC;D zn=Lr-jw})1Z%~cNg3@QCN%@V~eC>1w!zDUScMVBnUF}C~54#%Ok&h3Y3Jc0EJ_d$l zMMnccK(QOq@EOXVD*_Je8BE24MVY7RHiiS$qFIME1)r-DMuuhTx;^r5Jd9aC)Jy_w z;`3r+k~0!&9?yE8qGq0_dp@=u&C%! z`eM&QE~<*Z75g2HuRBheHyC4x(O^YEYWP*$s>M4rb5WB(=9Ai?O%Ip`Pqw27^GD*r z*CX=e>ZbKSw_2&UDCETbfA`}4k1qzx{&Nx2F3d9~8x}N*zZw~*KMVc(@*dkxOuyrM z6c)7{D2ZvjLBgUGN|CAwp^rTcTcQi@|5(JdPoO}aM;-&|cUtLZNUxe6-fY>2l)Q_F zABS8W+3LcJfysL@r-|>P^Ax)k&)w7xF_u|u(0DJko&7f1Q<|Z)&S2)RH<5 zbxY>gJSx?99ts1utx)oI1rqarUPB5Z$V<1yZlBrpzNGrY%RdCu$O9GbwNexmB+s+k zMwN>K!yt8M7Fn|n6N){QdRobE0mveD+HZh|R?Iw-N4t&zHt(8{IE$QA&m%bZViB<8 zs{br&MY$al_z>=nLY{_ZCScM`O>|7@)-?t8CA(x7->&=nX|V-<@Xnk$(uNk@owRwC zji&?FNyD1tzb*?y@m6OLX~O~COeH0Q=;Z3$hpQt@oveiW z;vq4G^3sy%AZ}S@&5{K~;w6H|x@HovWzucnedYLhL+Agf5jWqrM^_`82~-P|@KwwQ z{;-0icD@gC%nX+-fQ{+X$7RY08#q zWv;n`e@zJjC|hEJ#_96LKlL3-5nTaaY?nga#!jsL=_u7uD`ECYm5-XjcQd%dyU_J* zeCOK_Hbw0Be1l8prXif)xi3!LN>iQP!)gPmy#uE1WU^YBO!?Ikm+)YFynm^#QzW0E z9QPCBw&)7Q^@a(<&li_orDeZsbIqQ0Q=Fi2_smJ$P2?aG$kU!EinJW#P1GJ6n~-3A zLnEcL=@t!lS&Zn)bu!@+4M~1mZtvSSlItumhY)^H%$PHyi(9ty6-AAEd6>dE5H zWRmy+XIm=h^TeEZv{@ht`BOGpJ>Ci|>*-ci>A1rY@B$(_jHK*brackQr!DDo0);Z6o zUx(Bc3+CU3c>#TpI4dPUNB8vKoeBT#UITZPFiHO$#m7C`L#fhfUlJ?5_ecUi@a!e` zFy-%92qV|K&7i7vBEHM`C=g1d*yB8{8SHpP?`P8rx^BC_Uc5!pQl)qC;L2cJ&2;O# zHSE#}vp>beEtYQ)*rK!RY^Zs9)Jn$m7DVT)c~9{f!RZ(s8uf4v%g<|n zzt$}kCOK?8LpGO&E>~a%&FUL#_D2tWDn}_2d@*g?73>jSy?Y*Q3G#(Su*#!5eQ;N- z?i`rN>Lg5()I1{~C5p%?Que1#cC{QQLyx7TpTi@2%)>r#ZVg9GHy#HH#9{X+<`>R& zWigZJ8jM|mVkTUQX3e}Ym(SW5MTsAXSc(8vJHvrVqS{yEtfo)Qdmo;Ed*Ze}jigEi zQ5KB9lv%>R_eJDdo;kTZ{CWjT2V=n!3(ywDZWs?kHj`OByw(N2to?z8oq(NmeyyqL z;VZKVc|THyMBEWF?WA`fD+#(GwsFLs31)H6h3!3J)-c}0n}su%q+q?~Tl(PBOgO>g z3xYXO!9N_f3-FFY{?IX{DxeZVr;zjNSRgXN!Z*W(VO?{pKx&mlG_uRw%@9Tz=XH$d z#D1Gzm|}_9`DU7~ebLzv2T~v3riB~2I=tp@ktGOv0u!$N>;I_Bkpy%nnJ!{(pS*AS zTc>*l{l4uF8|l}bAMcVja^1rLza}{NQ*;ij$IBC{MeXBzxZ}y~LY8QW$Pk^rfS0## zfs7gVB56;{Ew9JKVvmXF#;H)u1x_R|$zQY%ds;QcE=x=@h{O#V&TjQ1K^utKR zmE*PP7cQ|Rr>S45j}|wjJHWuOQ)&9Xi63ZJDSe(&#Nm-8AXOIpxc)r7IqZlutiI#7 zbv)g;7M=x@;We1E1Re^rMFinL`%{Dx3BnKp4!WT*b z1*AhXJsrGB#QxO+3hXJ(;rb1hRV=%eRc}P~TZf?QLuZP@>hruvkVwIGBRCNEO8rnEl{*^=r+iT#R?fc+*kY_K2s#xz5{>QIQ( z2l;$wlchNbHcUa#sQ;L;YnXDxdM5AMU}43fWk>P$j-%&NJ{o#gxUWfSr-6HFyxCX9l>3uD|0YlLrgxsImQpgU*?$JJ^;^mH;>>)= z;%_irV#l2xumw}Wm&K6684lSa zn+~mTCZ6O^sqsGr`}x=@!goR88`WDvzvuAD)T1=!x>dHZ+jtdZbWHF5VPL6rYCkL#sPG`U1@SzL3n2kYoN!a@kVKC>u!e}K`qN@nX{sfmFii7%XtUL=Re!b<`ean@2yjfA(%&;?u_t1Uj zlVY|DC~MsqZ(t_sUBqY&BE7|G=01t6_zv)6!$h%0I<;fcsV4!?1Bend>lrT+bG^)f z9J?~4d&uBLI!90Zh z*swePalwoPVun$y0S5YXJ{jO3>m!SgFsS1jP_Me_)@!2oTNa1kybIUXeZ^U7=-LCYwY6h89sId9-z$c$oa}wQxA;qOOxtx@H!71#6)%G zEZG$(Z;4YBwNT3qLnkn**)(}4LG<|$@?pt|6DI>z26Sb@YRzoCMmlo*V|}Tuq<$nF zEDo8IP>COwAeWusX=}{Xgto(VVz!Biwc*o7+q`xMb57XI)N*V$woN1XcE4lw`V?R5 z9{$m#0X}c4KFXbIQ`O|Z#B6_34!8%QtaS+szjViUD0+++LjbbFi>?OIqq7I<;HKZ# zjw$HB!NCmh1rxN9;nRGOoV|RGV4Tddf?rVW4f;CR7c>37tI{0QRwP@ktIu)aP4(+P z2d53ctWW4$60$G#nhC^@Bhk0~ zR)ubsh{He*RuK|w?*<$@m|tF^mZs@*Q^p7_$JW3xN-?3lhUh5Ov|C&($=v8{GLr48 z{xWS~x5~fmPJYef@%a0EKDAL0r+>q*rf}9y!nD01d-^GMa%z8IPcTSyNGM;zP#S(& zSEQ=vL`HngJHu~a#Tt!!FbmkAS1=4RFCK88@Yc7v@MFbW(&ZsJQXyc_kckaJ#Hq53 ziPGCq?hw9!%QgL)pFe02PgA=H3| zEaqnx3b?Ow28vuOMoRlVu?1wKA9%r_5-n!PtYPiX4X<5rRv5Lr|4gYvD3V|#p9vsW z{|pChki1W=Bv|Zu6~r^ zluZ|q5mNcq9ZhWlr-(#W?O;~RyfBWv>YG=Y^c0;(NO>doo*;RxNBP=7Zo0+#qYrU; zJ3lIIX<(C;Z?CEyDutg3(JZL8qIb)&vW0S6&g9Ea>mSZ|#s9)8+^sPR zR5>)PT%y)rkBl$pell%xxR;;v$Bd9@xlwlDowlO<1-!F_1YH;V9r=8yt=cLukGG|# zS<4)O>vUju&PioROP}Wt(@bi6ZAlVddzMdJExfxWGeQ?$TN~!^9?H@yeUYK^ws^2n zQlzSB2bTjG1>u<6drT^XD#n2_csN31!zBA?!m?ms18UW%+cK#{*`T|~_T`eqbmc9Y zm4=V%cH9IB0W`?O%of)$6H?v2d?$j+D%UFMCEruLtCoo>!Ue zOm)ZUbcTnuh$x&#MQmHD06+M|?uauF>j;}o@RLtpu?mw%(NNA}joz!3n*qhoJnqdn z`*m7W(7j5$e!Vde_TNad?x>K%tF{LfT@Sa^aC@?FQTR-XUY?ryO`Y4ld(84Drj(uH z_dJb?Ds^jy85WT6Ag^D?gPCujnwiXmZ^I)MQmt$LF=(8!l@oAkc*l?ryGk_20km=% zVKH^fOuyT}6bYm8<4ucGH)>7ly4E)_+mIS#Fb{4;sega$U*vzTDu%MAi)Fg)zLV8|2=ftL&c|fkLbE|S5EK|qZ-+|3@$@ZJ7D_i?}LpI$fvcUiFyowK> z=~oBECqkt32&?!8-!ZaKxNupcgm_hO%j`wSb~<@IpWv4CZZycmnxj}!{}+32vg|6; zEeSqQ41&HHNznlMmEA!s0QCXRlu*;{b04z(+T&qQp#+-JwuzAeyW z5$}cbhe^~-NW!hM_Ezw2PtGcON;UBg6!}fqsfNmFuLLp&Hs3gMg);gwY5iMgfr%1O z`*L`Gv%!Q%o(T@lQeDpOZV0gC_hq240ZR~sN5h{J%nKMY(<~cG!P*~2@auRpck|nj zW3$IZ!lQqrifEvaGKHD__I(y(tHoxzt}-ezbh@>lPyc;^n22{#&`UKVhdYyhmxf8d zd?CVNlx~3GyH7Q_2(&A|ye|$KXtCTal1~LoX9V^^LSNR6$1^Xcv^9*P zfqdtx?o%#kH_<+mX=Uo(*uC?$QGo9G_kh3c;dkQQ#Py^DXq*p4b)>%G+z?OSg9O5E z{Wiw}icG&f$A6>YKSs3=c0KwIl3d(U&t>jr_$m|^ffJValK(iJe;-hJ{U3Lz|1aFA zjw1)cpU0}5K{1CH?QT+L4hA0cS7u(pO;8^lysBp{_jl-eeiKvF`uGi(P?lMX+_Oqp zUYFo)?fYJ|zgPKK(qXv5=Xr))R?JTuZ)dSId(Q9StUSh;s`5)r#XzChsr0_uLSdbo zBV-p*o+7nv>1RZN&~4OD+ zc+N9V?@9!|-u=tF>-YdmF)!CE-wNsi@cOigik^x`?kx)l3*BhZAmBf*_a32JG)qhs z$WG^MOT(GJqAT{Z#=(VBAghj#9R3e0DDFc4+X{+*MKsV*KmJoLfxARM$SS8ycN1`xk4JzR zE47+H@XuwUf2^PgN1)Pko&LYDg1SgIT7%5+lyVISC+B_{9{SvW+d*l6ntJqDmw&22 zp!bgaTETy+K>UYs60i?Ahv;wqF-~HdY{mhW|8Kmp#N+e```4BK6oo+W?7Wiiw+8;I zcxT~7Z>}1|=xxX~&VpRGQl~~4@mq*h=J6jkNpy7@c%$}1P4uB$NdGelrWYDWkoj{g z+OEQ>X*P98{oB=u{m+v`0@Yd9p}U?nEC?H%_d0C950rA*fpwMWkT53^G6h}c1Zs$X zTLW>I3Dfu%UB|lz>Tibsf7~l6<+}_Y;5c<*5(sn9H*e@YTS(u5m-8igf#7?d^}5Wb zpS%u#`3eXgJx7RmOr*?+yighDkacqI4yu$A&Z+P@N3~q`SlDk4SZ|2i;LAbsI zevXd0=6)1HlGn-Mzkrx2{-@A22KRvrElXMJ@QsniZ(P#GO6c%&aRTt|dZ{6@f^qt+ zWOAAIiZAGV|4ce}8NJgHnAgV^RoTWfe!Sh_o z`3|*je1YKvp8A?~4jXS47n+wDj`McuNpO$JKnpA=%`L%wuDW$D`Hoq)0NS^-zVn*! zwL$z9!C$r#<$Rx^5S)cZanA75m9J<00-pJ9U^YHqU|Ztzta6Auyf>e!Nt5pC{iVq( zxvm5|AK@=&2vAw2-1>f!CK@#_eFGj}%2)x_F#^a=uMwPwQK_B5Nh9(>| z@~XGMmx6_6a?eJPuxL?w<2w!x=)Fm)o-+HJa1`s@UGQf#mgv-<4(N;D@ycmIy5~SL zg@#XmQpB$56)V}LZ*M~wmox^*wr$k!@a^k5Z6B8B-YM_(yv@u?Yn`|?sxW8IP9%s` zoDG6#yHMsut2wMniS4piVLP7dCT{cR#)9HhdU`D==UKu3QECNV#Iw{2_(m(8q3rra z{X^?#Z1|6AE$DCms zy6ZhF*T^wrl2d`i`*^jjvN@!kDRK9uCBeiPZfjBfSY9#oKxb{C$76vL%6|9CEc@?( z`iHUtvqWufqW%qG!KaLqW)CRjtSydTy&Lmw#+UHHR*vptEafmFO@2V`^z4FXIqIot znJw^0ynevDr0?@m-SFI@S^EdL)7N5TPkqvi1|N%9qW@=|a#>Hmz6XpZAh$)3&G{K4 zJVt*K#$KI$CRtYkMGelJ8>^+$5hSYr-5}nRLW=DhkYk zi3Y33pN{p#)!9a@-bWxuO{3LmZVT;(uf`s>&bSXb=%D49&TLI-fPo#4ZFadq>~LA* zbU7axy!In}jV1nL)3de^?Wu7lQ`wkBh>#4Sv@HNBJ z^~cN<#hHjif9bdedDy51He~X~t9Kmg*Zg!yX)(yu=Y+ce;(gQeT7#DLD60 zocOiJ%5gpsQ0(^m^gPr-F{u|y=?yi_<0O_>dM*-16Z4lUEa<)~?-HmVxSu|;SA^U= z_Kn(E&kHglCc60G9Thiv#1fcT|v_%w*e9icna zX9soQ=f1UOG9zaojDmA7)R!iu=262b7Ugixp5I%F3rUo48k#c-N^&d>;S>tW_htUs znY4nt6KoU?@;ei8BwtmQv>d}%EW?4P5JzC(iMhA$ALia5!rb_<;+nEt=|li`SjG*; z@xRslQlrXYd)YO0XLQ9-CtYVJ>X6WbZU@uXDS0_kbIXS&hf!02NTIyR)jM=r$+b7| zrqiO6Wv%IgLVHq@cP$&c=S^dr-#8i-rVS!Y4i`u16sAt<%2lBu3k{Icg* zJA0%9tq>iE@>^V5oObGs1>$`S=R(+HkACY@A|n~so{&dv*284O{odNEfFq>p%Xfgu z9<2olxaFO3D}-*>Wnq;mYgEtgu`_?<&PwGKy|caf)AcK6)0 zcb=GK!+&E>&#z}i)gvJVq1_>kPExFJ$`KNX^~a3U}X>I-~rP z4atyzs#X=BY^B$2EP; z`RvUDES!x@1G6G`D!*Tg%D<5xE^>&S({$r!ZL*h(ViSMAS*GeMlb`sGu3==#ADM3g z6h$VAadJf-JN9*2H^iJpeC~B+pF7iz*@K0=yK6HI{z2vy>%vQlzkh)e#;s}TUNuvp z{As$`>?-)dc^H1dFVX;Z1voyo9ecWBvKl2ofnd6s{`M#xI98um0aXX-tZ1b{PpO69 z@=fS55s$yWojeaJ#m}R)v{EwpD`)gMQ)GfH$?|=~5{xPb=XWSWGkS(!(};Brv$!1e zV3@n{riO15qP(X*TiQ@(QcEiNkB`tkqeo_0F2aklz}zXPIJHX>6W-axXf%NLZ(CRPAO(<_&?;M;FFEOph zd43zkoljorkb}%(bEn6~^``^!JVJlz(45V(hgs<0my2H%bhd`7I4L5Pe*IL`?i1gg zvCh(Q9A>)Rq?IwnlI~Mvnl5+r=&%WVmqp`2)}O|6BvPpJk4Ck$+4*ibJ1A4%GN0}~ zNiMlhqEE1(cslmT_@8klHGdt4xf^kMq!#WLHcj@Xb7O4p)SJCf>&>n-ZRk||Bo+Ql z8|2RNIw&~uJfC+vsFf-HYN&qtg1gkkvOW+1@8vz@9_F2s-Y%R42W6dNfgL8{_i4XW z+_>{!_+j00%2|dIKe6!;+0Sj|C9rby=?K*%4neYcz~0?v)%6&)7mjjf6HnZ;+6_!3 zxs&_n5$S5rO5MvPj-rTM9>284?o<6NXNgtOJ-W@ff*O7XPb-hdGrg&mx3{mQLTt@I ziPG5RiT=U1`Mo;W0 zj1KlVqCa`R!!52EUF=W4Rwu$DP}Ss0RX~?_4{y_4_03=S)+#F(wn`iJCwQl~qUG>y z6ps9HV;^3)dWZ8IhzqEMT2w22gR>($KW3ojeks8NrR~`kact182)n1MtJoiQa2yU^ zD7C3fxzm}(S3CZ-)z8>*?8x&%rD?@NJ(vy5MiPX}6PN6X>PMa$&P}l94!H*@}XtQT7g96<3=#@Fz4S>L! zlNHgH1q)hZ?e^dhcdlWHFBH(JQ@Qwfm?#^4RzVPM<-Wgm3(hwn z)m2$mFSSmRNWEM4%ULhyb-Ac;Fd0)1aYJ53^WxoUObPWu{q?_;Qt+qH;nK=3I5UZM zr7(e~D}V@0`W#$`_U$8WgEn*TOFJpaJSS9r3G< zf!x=1VkVnP@|l=9xolFWUKnB07ZA+~ksv5J+Z>|yEJzBmZYCH(Nfwy`$prK09`sC{ zZBv8y{>*5Dw?@(YZAaoc>3r`GMB3+mJtf>t52%955^wx;m7pw$=G}Z{1GfPmvgh|T zvwkM*tvpcXeW?!P83esMa04zq`&VU*PH{`9tx-naqYf&|MN`N^TDgr<;qRW&nS$4o z^yA$Lr%Aw9?L&QN+`(-SO?5-Naym76{~Ad(>39V~w!%*zb3%SGx1omb4(KcD*Su(` zeui>3XOFzNQX}^w?^21zo79Zd(V<2jw{S4lV8(eA{UjdE$OzQfD`1&C1drLkHD|tK zWR7s2A`FmEy?j&i`K%j#MVLIF&)U?w|BdML#11~q!RcoUKh+J#bDzsTe&UjQgLrT< z{(gOwDeG10cIy;^{d`#OGP*z?Q8%x08sI#lr%!*_cO7LeL{T{Lvl2{BC>nutDoQ+X zMK}dv@(YRibcHbh2nMKLl@*|Rg1LOOKw_n=1Upv>GE;NZWY7}d9RTPg?b-s139mQ4HPb1V2KvRXB>kvlKViJbr z%GxMLsY|@~0qBDO_#`0d*dY-a|G#Zn5xYrLY(!S%qidbBZpeSXWyOoRm827-`WUl+ z`AwgBlb=JN0&^xCSzzpiY<JdIT=fWYUcI?o#8i~|nT3l0x1a*>hPmr1D}pc&;L z$QE$tieYAuxWRKF6a_~&(J)SZ-!Psn$LT;KIU~DKyDI478%U!qg=ABu1a!{hd%8C9 z0^*P7`5p5&3Knlnvo^h_hl$=X=kI6})h^Y^n|N*C> zPEtD+Wo%QXR@n>fI7a;zbRI3{k*?eB!}9BgRY|Jr*7;0$VQ&38?YaIAVRs|rvSsqt z=$2RGuiompgZ;JClC*qi*R(#*lM39Gpw9iu%7(-M345(b?#f%!SNm~XnhRq z%e?72ct|xdMl@&6VO7P^VfJRFIq7{3sUt`C$$O0!)`Tc@N`il3U~6 zGQPS=>IR-0ZUs({bGldf-@{v`sD7-pY?Yj5?ZkaIZu?VoH=u2NEO?X|rPAu4C~2jT z{@RhrjVxb4Y9|BMgy&H+z1xeK#h5(KZf2!W;>xGXMKs`6Wego5et}N}SznaFEMzy0 zF`gvVpMrAxG^&ye1|a|rO3>c7SrN64ZopWJ-+}m7(|_f?0t!+3^H=6Df1dlGihWkP zk@uE{Pp(z3ZyxYGAk!r_95@_692e@;s_#^?j?3!^Qub>g){H+l&(V^==m-uwYju0# zv#zH7rVgL(He5d*bOWp##M^9s0%J%-X{@+wyU0T@(HSDa+A}D=+%H(w`;?b4LpV*Q z@^nXu6iO^h)O> z6!*pWT)P2AF%=d&z1j@4E#rdEAH|y$-qAauDV1)-$rof9(DM# zA#WsV7w_`9pMNR_*!#&_?*EHo;5bm6{I_C&yZoaFK=-ny;s{^A5t?UgJ*72`f>_l# zzyDMP+wDK827ZYwLB3vF6aH6y4fUJIl;dq`QeWIrWYXn~C zF>};Tx3>j$;oQ^zQw@M2*yPfwje1P2KI0d=;9YxsL1lN;?I3tjP()M?s99Io=YAiIrGhvi*eK)-Q%HM7POGShxclU^T%B5qlC-|<(8L>u z4p}K}6API@7DeN!aeAx@D9J0j2;e0Fsr)iVblOAoeJN# zCgAMFd~So~_LLyet9@z%CZ^SocImwb6FGcSFpZ8Ty@## zCpGZcWk%l7_hP_-zDBrVrSH=B;W3S0bQv za1`ByLM7F_a+Th8UXwYCD!~yobG1LT>TnO1f2PNe!-it!FczB;&{Q* zOR~o*7%joMu729DS5zILJheYL13k+As`ox(ly6tvHmt>Ep(Q8kPzPJY0_adEmYntO zgetbbDT-m>RxcBoc+(^>EGNPOMcG}IHHmABnU63lE*f&BV=ZR%YZPCmmr4x3_!bI^ z0xgJz&wYI7RjenA+wuN^803l|KT9~fbln#L4cRg9Fh7n`8C|_;+BrHixR-(Nb}YF_PAJGEAf*^6z>+zkL-2b5$)rgy|Aqlg zqfpYBz>QZ{I?u&h^0q^R8F@j4_e@)XJyIRQN3yX(uPMR^B z?keK*f25rMfBF3%mf3ZDC%C5AZ7#TWtOE)^nKyF#oVEDQy~c2+X8PP7x$mjD zSoK7_N56AHCcBtq{*F8v(S@D9OUA!f1Z` zDe*z1F#w?hu$a4=r=F9$b1N~XEJ z6apvmmf_5NT=jQ=5uLw$eWtWQV5iYETbvoSBtJ&_kd6WjcX=^tltdX))=k$kz=Q?NR3 z^VI=?|My<>GQpb&2Z%PJmn-$o14QM)@vGaWjC6lg4EN2EpiixUzU18f3&Cw%HwrPg zdoGj&B9+S6S@0^e?)s@L_MP8jDrxCz9^*ZYeJn}tC=X(wl0@byF%VFvt5 z46e%SOXu~oT^>C9LvV9FNR89m)}vZPC^GfaV@xfNB8+?Qos0J9_CewGj@>zJC)t0& zOE&F)W&pyr@UPtKMX}=iT&mFij8(vRu79NYd=04e(_ZvHp)l*97NU*o z=0L*pUl5F@Apf8Qp&}dzN$mVd1h}M-5J`yq#MQ)EvT1@XK=Ap3yYDAzKG_8J6#?G~al`Yz48`2@GjILRRctTnj3z}u{duE| zAsTuj0^meH%gM^m>sknuj;o~maHKduC?J`~Oze$vnU;xoR4;BB?I+5EUb~WKZG+E= zE5(>PYp+~2$PcoU3PnWW=0<m#|G^b8Gr`AtyJ= z++c~Li|tq&h&$jp@IwYbZ|nT@2S5GzLdwHgH<)69V&QGwdrs92j-WCP0ZgyYGx_vN zOm(cN{R`O;`Q_AW%lxCRExO7hFc&fF8N#wg=iBk~8cHlFHlGb?=y%K`to(SjJYRJl!$z{=@`u|-vGDMP08 zB#zP4%sf#)UY0-d5}722$V-j*0t-t7@Xqp&E9*SUwO&VI17@L75e7r~{+X|RzIi|{ z@Mza|gz66hmIflNwjBuep&}YGeP-(YIQ5OM1*q%k8FLNLH4<5M)STaQ|Bbrl6HqCT z(tz`Ust4U>MUnHxdnF|=pW-)?DW3p;9(%kHmL+|yG#l-+TQ6FvNbom9qA)A*+*0m# z3~1!ObGFL)6QW%R&S|UM;E}F|IQBDldGzSPYrfdMV2G^rpZwg5_4nc%$Mk*R7w@IQ zL1Q$+dAI#8>_W%(^V_`A#?)6{Ba`8Km8s+QUYq_G;hp^rGZ+opdNUq9_nSQwh6OI; zjxWZwzgWTb+)td=IYbPDSygayF#vfrRHAYRYR?XOR_yOV$4krROc=nc*};0N_)>=d zD8EtP{7d9J>W;l2-l%D}MMdINlFGy<`5Z3@1_+U_E61Sp@4k?wQL7%8CLN=K@K!(KXqE7O?5Gymw@s#3ep?s!PmIxvL>dz_z#RjA=>SHIL z61|fGI={ZltgRo^c%l3c9e6!ewxhx0&imFby7SIc;atYr~1M^2{lc=ii)m3>gQ86HBD2QeYY%Y2x|0`6n9I! zhUB~O-23!8Mek0|y?CcX!+T%3ggK~S>a~SNByjgQC+esaW1g%MxB1>v%Nmcirbx>k z$BNSH_DqQpEv|F;2@A3Ktl(7FUBt{Jrc{HW2;VMvt|hL!{>J6`J=ow7Y#BggPE_v8 z7j?@jgXYxJ;pJ8}2HtTJb4w#GTop~$;+Ve`bNHo$^$}+=c*v&)7UUDn6af3%54x>H zX5JV=#L?V03rNiqtU`)k9^%~2tgwxosx27jY|2mumpJe9QrqJz<#S?SZ`PXBKz%?> zUv!*|A-?i*SpwNW4`CS3Yz^O1_v$guH2UlwO-ZvY&%M=Xjo`mS9xc`{7U&sG0BrcZ^)v5J>-p}NBJ{`{0=b2+Yda;+*o@=luQs7_5P%;Ll` zJ1=ZbcD&fDs_Tx5qG(g|J^4#7-2R7J9AN-`J?m7nS~{ZG%6zh~2NBFX%YR-jsf=Dz zX2?F#AH_48^YE|yC&GgPf&lq;*5xb+1@hjao1a{iVf|Uoz3NHaARN-dIoG!yy1Rmy z%K;m#FfUa&Vk3C1@KkJXH}nQ~S@825%|EK`h22lT3uolKoX5`mj)ua~{Oy6)WOwcz zkY`PFJPT{YiHQ|n&yxd)5w8f#r0}o8t~| zWlYseq9#*{f@LkSnPMZ&nMDNsg=i<3U6U0JejAi!(06QC@N=#RB7^NfZFMJwzF5F?){aH@5LbM@D+WSIS-n4~5rJ`LOCHqE zle&Xq6_y?gO(SUwUCbxnfm}^uxu?GSR#AlMT`^)DFGhHSfe~AtYeDZEizz?iha^2X z3lhH8Za~aN;`qH_tW{Lv`1qclI@T)QzUAiM%>o=~5QvfZ!SG$<%u~@VMK;atkaR|9 zB#?Tfa86GjF*RV*^`l}4&$QE8^jx-IxjU4j-_O47Gm1OrpnuOTXEoE`{Tr*Xc%Q{y z?~|y|Xq8E+93OW|3 zL{>!Lu*6;DP2Ak|B!XYFu*r_JocX(afvU_#Q>?5c(ep}&Ikq&kXyAlj3`Ay?seH6Ko z=!h(_Z}5J#FG~xh*VPd_{$T>)ZD=nXz6lZl~J) zO+F*y)>Fmc`n`F5-wLTIqSR@>+wSlaWz$S!^dO@950ymOvvHJ(?u@?iU2O524{o@R zb1iA}G|~Bzm13y7uZ>0@bT{12R;RbU(1peT5DO#G2`}p{#@ttEM+u@Uj#XkEt|! z=t2><5yT}GKY3|@A$~th3jCpxycojvBaXL!e{11+DEhBl)rmVWMF51eDq);xKva!NP|L#TAwtm)ftG-Ms3R`ssh!!MoRSF^e1k8%#1xILn9o>LS%B=mAc0h{Aj4%!K%z81E9NA^K5iSC@W|##1XJ z=|xwP*tx^IlbxbzA`gwK?&z-Xkjn1!H*5}tXbDKOlssU|Z84YUB0U}boof*<%`Lbl z<8W7{d!@4_v??_82ApSNPoY)xtYM@;N>ve$ed+gA!c7EPucK_| zADs$|iS60t7W?a2V`z{o8k?xk`#pOORYo*bazv1mz6I`9$^IO@b6i7`Yi_^*-3pa-ya;-$5fL&1%+C`s#&~XrP{%+gpoiUxWo4XwJ?3I2@hiM z*U#utxtL(f@Ve>mxII;juaVtwl;REXfmz@D?rod*z#cNF!=MFbrhPe+HaDG$-nU-F zlIphd?xy8pSOd=(!bx zD`mF!>U@n}7OAomnHfW2T^6<|ZFs*Ee>Dc&5$flf(hWC?KrYU+cWQwUL6oOYzg|o! zD9pf9toKjLcZYkL7qX17AgZVBVPkkEipe6?x6-1%a`=5fUcIf}3|3ERd5jmeVpq??4e3)vu+rYV+WBwU;kxC0J!ccNQ(jDCS zw4La9Ag8#LomB!=+|KePdx-JX>#dTbf13Q(gdkmF(N&52Aw6Ak&4srqW^A7lXmlx{ zp{OwT_WX*QqWhgkl_R!R9SJ9$Ouv6uR~@QrIhkWfc<37fc0xl7wTWKme9=)moNjRH z^1JD;gq;(CDXpc9`um`~35s&L?lN~V3vDDzA;`tG7;ersQ`0$j`3RS{E@g^g8SU)B zi@24(Ru<6RIu4BQM{JW(nN{&W$Qd9fZYHQuv%S!@yEIZy6e|u92j`yd7TfvUF)~%5 zj8K_;8SLr!^u|*%l}!=J+2|fZGTt@;%@s(s3pJ8^_08(0pK)@Ki+ryVk}Pd@w(eRR zIIGCbcwA;Umb<}(#zPO*YP}a6>T)jTEIROy*oZtm?8_-QV^#6m>xcJTc0BUcO}D#f z`2Kmnxpa2$gcx;hAKCq^G4ZDY+r(4e&ylfd`4PQN2?7<1mI0_y59WyxU#OY0i=CG2|8e1_d*rzXK zMBhg##}Fa#Bduek9Tjf)Vt3vPuc7A-N{Bfazgx_-`>GZbrY?a%;I}QjbX@Nj8SWBRDPcE z^prkQ7Bq7Av);lLm*LL{Sh0ie3Ca!{%f`BmBk!JbluRLQwcvu47o0Yrrds1-UPloZ5}>b=FSws{NIh zk`1{IqrRtCgziB8_57Hmf(ZHu-UmooYgPBx3f-e8EkVEs%IzRvVInRpA2L`XJRKfbqU2?w4Mbr*GRM2PN zS>{|rY9BCrjU0RWCLn^|pmDGRQs|enR^ZhKl3sk}U0x`T2=*SxiC9oBP{l5_cHqT7 zrW(EVefW7LVMTe|+9oqlpIc0N6_p2HT;JrkSl=f0`i@vK9=ZOk_eOg@yF(D^xQevZ z*$rXDRnb$KxKKRDFyhBKL6qMGO3!q*L`M-L;IB-KA+MX8r6`}c?fQe ziK0-yZUNQ9FaQQDqf??Ij+BAOT(E1@g$tuy#rKh{0?K&>M#qRLVV0(=^u1R3>mBh6 zkA-%OrqGfw#h4X{%T!T`;#F2L<7pLqu7_;N6=9u{J#&^%?!=-a)Eep@nwB~zY3ye6 zWW`!nsypo^KdTcjfz5F+uBaz2?5Uv4AO=S`Td*KKsPS-%S10Oa#6A!1qV)9gSNQM; zwAxq@A0V?k67^;${-OxDE|RXa>KAr zvuPR*{w;cwVDxG)bp^L0fV}0CTDKrVlX(|KYP{i5!{A1zK9yq#hGRf&R0sj^`@d4o zv`NA^JAD=Y^I|csGUoy|g5o6N82`lr_90`Z-n&NgS~R%}p>Xnvo3R-L(1M^R0(H9B-YdBC%FT_ob! zD9Q&OJ@J%it^<2(?ccsxw&U1}Al#}S`dOyLb=|0;6-ALB*4=vfDe>^Ut9HNKF|Zyg zLeE@2znK91G_dt(c8f#woeK(p$67!{MR-n)Gu2j7tL5Sh^_M-ruy3@#tzQ=%KuE8~ zoIT09shW8P#fz9wfFf&s)px|L4D}#&ZvMrW4RP@d4SwORe!hD$I=krWCQ*;E%eX$% z_|7be#=ZYVl{lw<6jlZI{gHCmm9#3!nF`jQ@+hH(PcUiQ2>-h>K)Mrpql5AV7ea#T}yn zG0)=Zot(ezw%zV-+tJ~R4p&q~ojRwaEhV|WA#)8(CTHK}v>?uf;X(}3w+`RS@6-CbbbFcP21i=kY+;Wh=u|H_PHp_IJJa9T9U-t4`n)nEi(zvyP{IZkZC;ANL z-*H^Mf{Yx%|9skh^`8D8eA>PXO&9VH;AE#FqTt)hoqv5hU3<>Qs*i_D53jP7T;ZLF zuhB?c?>UVw9W;6~+AR*x&&j>G+bo4x&pFWeY^9H?4Vt{hcx-E!}L|B(c`-~RWhoOcR*h?y{n3bP8(5qrzK*0j;VD~wxC>Ka$dUz;AtLy+um{OD-;^D2TeVV%m?UylP zC(QQ8BOQ6F2(4y{ne6>Sw%^mSoSYM1)hk%p8#fhv@4_RdFFB)T# zK-_b8(%wX5^JJhO*mG}nI!@aq!bdsW$gyJgy3&g0{|&0#O7^Ulp3v53IAe+9jZZ9Khn2!wAN-f;zPtFJ(|xb|+iqr@t7c<?A)?G2>O83RMDO6i7DC{8p`QzEJ|w^ zNpWkSfCWgL^gQ)Td@v-JMBHS#%T@G7VX+5z@cY&|jf6o3uEFwr=!;FC*;`Q!aO4Wx z{?%zVmw0y^L)wP|Sci8@0%J`eVn8!1$T#AKpb!eEf+frq!!%BW7g|Hq-Zg^8iTb;D zBI~Oke1pADbJ!~WYTv#gQ?r0f;Z%{ zc$0><1#-(STXo~E`^9|^t|88^Of|b)x5Q`-9&e_DJNJkS^tA`gm6D7Ge;nBbZ0GUs zd5T#ub*AR62IwKJhdJP#n z>_75{uHjhl%7GPHaAY`e1r-Sh0y-GtZm=eeM;?^flN}P!#hn~(LWFqLsB=t<7PXCf zHj&PO`>CQTS7CO7T)_wl!!ypZNC$ij&audkRh4-W0pY50vch1zYEbrbf1$HYhhRVnsu{ma6|s=#d(EHU7%OMJvXL~ z4dH^Rpe_yrvfS%8a??JI2=fAc3-pm(Zcpy}^~>lNMvGxC3+>?ZThGZ#IBW!=W5PTw zan(ke>I%tlkfXlsdHDMkA`!H`KWDXu$%hde28eTMC*_*;6B}E-aOJICJm_;Q-QT3m zpVEBJVKv9|Z+f|#)*yyfkD;U-D8PlV;Hn5Spf0Dmi_UBt`3gftxv;S&-=kS~1&vo6>8;FPLn~Oc#-IbVm z4*uI6&PL*bH=TV_at|Iq_Bk8Qkqd`!;0&gW!+M7ldbR8IZmHUxJMN7=}< zkq({`h->gC>l?Wv`bfGX!moZlf!J@=xl0A(PC{ty1ZIMrCX_G<_hLebNYaz;UH$15 zyv&RaKMz5Vf9td+JD;7g4spD~1uE!cBMurO4y6;DLRLfT`5Q1o=d{e23sGSmq*?a^ z*@B+v-|t5u;S!$!B)U4A9Gb6B60VosanavyTjjE1+)~cZ1~;;dmtsjAV=Afu+jP?P z-WGdhkCfMuFvJn+3*9w*rB`ZkU#4s(n#n4+!$z>1Ka4*jKhw_^$6b$20YMD}NX(aT zbzyOi=j++0SEt*9MEuJAyW_ODXkvJx-dSjJDfkP6i3wTTy41b|abTC_ax3TO_cyHX_(SX5v(~k6(G8Mj zzKT1+(0I0aGsW1WolOg?qP%+Sm{;EHhYhBu0g687X3HXE|l$F zF852OfAjwSCI?6a^UAt!nE+=)`bPbDLlvGvX1*O3CoAPga?}(5*Tco9xZ3SCsGf^%i|JgWE0rK^^ z%r7t2^Dyarm+(#PPp216vCCSpK@P0ePMrMV47cCz>UL8;vEoO3v{Z-gNLD5G&#`*i z<0L2N!=gsSd3CWoFmofsE*LDstkW^DmCKPudG!vK35&fIp9(7p9ac!r)g>1P^@F2c z;Ev+W0XM3Qvlo0PQ?cKWjz;?;c(9r%vv&T(U;Uxk$M2mMSFNDXLAMY?C}V%uh5mxw ztxvZDq;*Ob2Ibmkf1HZRx?s8d1BW5cr_3Z@PWkK=7 zJ~{onNu3y^Z~Cl1^K??$TvW6N&A~&DR;^|>^afhG@44d9=~oF3SsL*XtsLdO*ObUzG8lk%{5NKF09_5>FNlgIk^Z;Lr;!o()SD9_wL zL{@GnXhch*c8rS{KVevCaTz8X1t((~f8YLs#fUf~S9xva?*!#c!|N3+{0m>Pb#l_b zPpd^AK?A1>NZcabqIQvBDM36C$}WvFw#HVL-@%JG|<ngdNE}YjHLF}Wn^)&|VggJpKJH81kga35H+Zu#UM0cA zzB2u5A>C0-*l=zpN0v;~7ghIqk~q(c)7ngVuzrw`IwAY7?pgt#_Fu0vhR}DO3xEs` zXY2LYiNzg21rw>`fm3L+L|zl=4z*fU2n$SEOZ#*T`5SK;b0)!WvF>5#ODz&%CZ;0W zJ%yaiM?@SjS5H0jn(thcY|qWCQ#*wMc8aqKDS)4Sq0ohF7n-HjNDJFn>|;_DE>@yzc3k_%l+kjEvxADz^|fneb` zH+AFT{Waked@vjN#Iz-qH=cIPtxiQ=E}kh8RBxI;q$XTcbFm(rRHkQH5~fQJ-dmf# zxsj<(hW8%&?bk4H3lhe{r{S_P4I%T^YDK3S*`Z6;&>F=^{pu-dGqjy*{33Og2xE^= z#&3jzA7`Bwcj_+z&xGGP@EL6kpROE~#6r)5;u`?}jmK4>k4gWIpxR$m zV!BmT8r^(xH`pp`Bv##Z-`Nv4Z{p;IW+zX&^uXKU~?^{$Mz65L0Bd` ztExzlc?eo|Fx=N(!v-sN9Y8h399}h9#>Rgs{&PBdCBi%Q7m4s7oI^%hc&iRbZja&) zkgBrD_AP&}gxVWlAqj_vu3iQBl2i6_*#vwi9s1!EW^3M^Ic)4zS0Rw$7CnPhOcvu>NGy&00|UMh0KJq1jbqKGi=X9duFW}zgdw!j=BvVyF(9zZ|^}s z7q65io_aa_1{|jNV0I_=>v1OarF~F2KAr-sMtl`@K(j2qy7I@39)%kC)5_pW@CN}| z>|_yr2}p;5-NWQ!e{grEL;Imao>JR{yv4*qTn9{NDI~HvH_V&Zt8Mbz&f)rH+&*YS ziJYT*6dy>wO>eue>|l{5v~dIopv<8K;tjxR)Kz>zvAoI>@J%*X&z^ zDSPlZsgj_@;FnZDdxj;F{c%c&`sfSWhp1#Gc#NJEy-9uW6?gC%-^OV|^Ezk3i{1Le z?m^~TY<@I})+wsN}I1@6U8M+)T0us-cZE@vsiw@;fhUs1O#m~pTCZ_x?&&{HzC z-7|VGF()y4x>tcIljhKNSdFuBJs4u`HS-^s|%i%gu}Bcoar(A4-LxC6)*;yD^b$cr*tiiGFg zBEN`uIaL>!RaMX4s$GPN-BIAIOMJf+c=PI-xM5K?(>-g1_B|CC!Mnr?gfdtY45^h9 z3o&uSM4#G;ByJK)IsQOm6I8$}e`y$e(Vu>@0hEQ;J=Qz7OvNE0&->y+a(=}`@Uj#Y zzFTgEjoo~|^+FZ#FxsKL!SuX@OCJzoEOCv-__rfGz%=)-kQnxMF`2Brty3X&2e{go|n zopTolc@@OK6EC}1V-H%<&UDk=&>*4|&IR7MW)#GZQ>84eQ7>WS#CB>EbfOi$9yr{JgmprZ&Chs;T_wPUR}eP`nZaqXJ^4JZBm9<- zY|>7?PWaM?ONQN*9cu{+wnZdHly#JtD$zGMV~?_I7HXMB-O(vl8m?Z1kA#t9WPu*r zEiZGW9JSWf3;r*y!%OZ`e^-V3gHB&15XL~J(NZDu)sqQe)~-? zzVjw?F(rdY9Y)6{9O6u7i7=>WoUs;{_k~8aX_M-_aVqH)etn#Dhm^vex@i zO4!4w(OS9$3#*UCiCuNsV*}3Os#hns0t0s+ghNOpw7CPs_3vW81E}r=r^f(#1zfLL zyAvqW4G7o0qTpV$O^5{TCBPb8zyk>bY!xv9A8 z5ZIX5uXu0jS}X-)5JavO_dMW&G>_Qh_T@<Tc;5t&y8;I}=7Qu5OflM#}oM`pG5LSm>VPG(aiqGFW_pFe6^y144#3w#V+(a5SEAA~US(?`28qRdEgz zP5uXo+4$F9{eJ(D;BQ=vpd^fJutVh@=n;MLVqtC41HN46IAj~!X4^s)Emxq{wIi^vSwd)i4jiX5^8Qr`5 zUbh1YdYEE;S{eu5@|qVL+nGbPvT&CBfG7v&_tMpY*d7}%Vh^jb_vHXEkHm7$yrZ$| zTJ_8EJ2-nvzma2!?DE6mHJ`ZY+vBpU;OcPbWL!$d7rbVquxBcB_XzC8(Y1Ub>^qK0 zPdv*7FLfnUOIJ&`l z=GD)d`I~MYn?+yK#=@(An8#dq0pMn!pTh9tGQk|cK;jgu^46NP4kR>^kj6>SfH{w8 zFe9vo79rc}6zo?n-ffhJ*N}v>&bY9~Nw&jlkD8MYA|LDn7|$oh=0S5FJ; zxQ$l*vvwM}z(4BHh?re@hnNnZlakuz1$;xinbE41h7yky>OEe1Y|f?R$F9?lS&bK= z_}OhPM61#R9dlWG#MY1$>L^!~YS?)cRHrmT&t}n`xIY_NbS7EuHFgaPb9cN*t z_2D_kaERb&qeq+Lt6oFIx}cJJ?~5mnC7)zFQ^tJ0oJJ+>K4`cAxeRdoh1hlEvD~(k zyDtx<|Jj#P@oWIiid+U5ZPx+a6QdrJK)J^a;Yv#KCH&$T{w?C;d#U4zBTsFS1X8f7 z$+wV}%Vgqi^c$PH2+{P^i7LWHyc-5R=}&a@40L3tjipQCA(g#bB=Rj@8AyGPa#ZLA z13|XN496z4tV#5(C+I@Q@JGZSQ5RPrwtr6J9E~P91X3Duz~pX6 z(blp4b$%P(L2O(F&Mxv>lnMX93|?z-KN1 z0jmoUz_hz^A3l`3iQy-77M(NWs5dKSdsBX$seRrBSq-ABF{LeH8&#g8?{^DhdhMr@ zR*NT46~4JX>w^7M?5A@%C@Bp0x#w187`}}~jdpTKP83!$89cZ*5LmAe4TeN)fYhsw z+;x0JvC1Jqv?7Z+=|iwmzf#wO#cJ+H{r)ZTbU69);*#`pise>Mk2Ly3k=V3Pn04Rq z);e!R*wFe2uRM%~lJbu%?pX7Q%(ir;;Ety!2~RD3AhuvUhDgqsD#I2N&#lxA&ZvkM zGxs%nok>*~&oJcc;CK>sdJB9@^oBJZyx0)R>Vd;GG&GNP3RND2#sNw7zjb#3#?>oR zV~d&U`0=XqS23{M@|$7dJo@}0CT*fvNYj2(Zt;}Ihzu$CmNrR?i{a^tNK3_GRlE`_ z+-|dOH<8g*rthni6o9kcZq%`0kMQHdu#hci=86#nICm?QO4&sbVTc;5oq6@A6lNfa zxqkJlR~2m@b5|YK#c`2P|KjO4<*L?*Zj!EmNj58|=h8}7mB*y2GE?H2a`V4gaPynU z@uT2&yFDHcqc}H)1$*)=<{NWP`5YfN&fdt;`1=rvpS=i8c`X8$6+)ofhE#3S8Z$Ls z+YpiPjU1R#8G?4ubj!VRXAwJZ-tu_+>x8&NJbzc+y^d*xxCydLZ(mCqk0&Qu=$}sZ zH6$MD_kJ`6PWzpvJUb^t?mu0RT>5^oV3P;0{t@?1=iIBd6a0x&6+Y+XEJ^}@yjSz@ z2m-of-8=9@U35K&H?rT3)rhBIom$nMMCMYvE9Wb5I1K?Y6KN6*~qZ7rPZZg%A^y(qI_i9h2p9>)XnWDShCNsU4g!?tMDdagKQ(dYs=S)8j#)*K!pE$m+?8Ea%)yJ+TS0@-Mj6o?Dx8_>P~c z{(1b$Z0rme)K2G@(xNR|&o0ZaV646PIxvRGuT$GTC-+sVxKKkt0LhgKk8l5*J5wPl zwDj&5Z<+M1{gy~7vNt0q+!UA(YfMpU(>XE9#r~|y?TIZ{ zVZwQPu;-csm&U<1{!U=OvR!E2<#dLa+BV>c=%l_rbwiBfb96(#A*H3ohdY1FW(kn} zd$&z>wL~ipeB_amblWcuf6jMuO4Yo>W$$D!GAxoyKC|AM;(@lsBFm4xefGrDs7cD@T}M%&bs{BFX*+J7YwRV(2;d$7a?4AOS{{GICWpv9f9i$Q2}HNK@X?o5FvUB zv6%j*B;?1LIHf_U^*x#H&DwOZML_GozpC6kE{S@7GTlGEk zmY8mJK&?84C_M-&COuz4$V(e*Q>**ff6;4pyQU;2qh>txVd!skR(yOe*f23X`F1YC8Q%-Omyju!iyN-Y@W z1@^hrResZo`&K25ssCzoRvf-j%yb!iW-;|_i`~5`ZpQ@4&KX^LoOb!S=g*yxy=fo) zv7tMNjETU#Or$5P82q(wSUi!?HC*yL&j<0Z2|u;lhos+s!#l{Fd*UIRX;iZjjz=AP zny0_4wL)@7XD_dkm(Ir|JbG)RMtd z(}$|m*v+bsYrfeo?h;!3wvP+!Y*64-7UyJXcERogkMQZ0XcxBU^A`#IlletoEw$Vfizw?on-j?Ohfk-7U-g-LdS~E2Q3Q=sx?5;H-T~c)z zS#t>>ull`qgX`tJxsWP<$)U$!dFHxxD@xX}1oLC(3KBwPxEDjXPnei5q*YQj8x8!6 zsMzH?wY3>A)*-0efG>z&Q20@=8h*Yni#4+rUyj^W_f%M9Vtpd)H*waxC`0U|IfK7p zvhs0sZ&>06cWrT$2z3nBP%4MDq0E(GCv&C{ptG8c;%wH4NO=KZw zzxDF=T}s&Ysp_83;dCp-NQ-X}ZW@Q4h?a8ekH<$}4y1j4ze@MI?okQNQ_1plJ*}}* zyrsNOT@i*!QweT#{du-O^zWs%*w?9*C85aha7V(gG`2x{=NSEdADx<|bm>=$l=tmz z$Mb=rgFUkWS2x%Z0aCXP9Ps~Z*(fGv6lmlG3g8-y6QZ>tv~XgO?<4{8p#h@6t4`00 z2@AgCiAy$FIciQ1mA#t_sqHYuyDlrm-R-{yE5c(n{?^P*kO2w{kvew%)c-*FJERX$ ztHWrkdL}@J(f8%XUVXo#YX+Ve^5q2O*v8K5JSzz;WO9`~>B%jBYt7lx|q$RJvD z`8{^J=+vce=g)JUJMq47Go7|5Le|k_+ihlmKqq_G$uj3XQH+dxuWQeu!BeB8kLhT_ z%zua4=z60N8nR`T8ad^^3M>i{{yX68i}B_EH%eZCyG@*0lr++8R58DS=t4ffZDeH# zn2JmcK|un$`mLk2w2mG*O+MfvAdJPnq)3MeTW$WhG|n!53W`0LjiAMa#GeG2+LC}E z)*m4wiuqO_0-T*?Qyo0hfN?1lZE<&ZcXxMpI8fa6pv4`EyHniV-Tmg^?(PTY>H8Pn znPf8iX_HK{JIU-`TOZw+K!{K3GEumm>*u1L%)WQpX+Fdq)YZC6(X+p^8~b~;$=ID> zH@Ii+#^`)yla2iVj$uqw5@BH}6mZI*_}Zi(0kZTOQ}#!)<&Omde(|)mghcJG+CAH1 zs?!JD9UycBd{otDZ1^U)f?~R|yzgAUM~k7&8wGg1d}Lk~G2(g@OUcLGoGERysDRqsw;oLH_$M+SBYN?sc_qPV3RA$JUE-7NRQ&2}jrxXj&h z(a##1e}s!4M6AC*h!#j5x8nNl-30XQ`KXYdS!r|du02MQ(tWXX+v?+vFmu?ToN#VkDgJ+*kX8+;R zHH5pcB+@3Hr_scadkm_OpF(dBURm_kDW*+W0@Aq;H67Z{(mh<;=^`G{v<`;|{X%{K zPJP&3x62-+T2Erd^z4Qnj14JHV3a^z{yiOiug3t8X?l9n8C{$&GDD%nLB8!AcDt5J z4UU2=Mg$SUoww_(IWkPSK0T=hR@0I+Yo;cRu%%uv)@w=gVR@c z_P+NdWLrjeo=d2dWh;J*cRzIh_kI;RkwuZF>wE@bPvI>yn~R#uYWZCfzaHSBsPafD zsVFT}pgW>5zWkR5d#b>B&}O0;rm^VRmoe)cRhR>6+Et{zmLq;&Z3b=w@FXROIH~>% zQy%H(T|2ISzV=Y>@UQmaE^)d_q!+as#K85=@bh(@7ZhKX+|aD-Nkzo8-RUNFbs~0( zL=8V&k@e2|>FZ=|PoS;bVXGZa0o$KdN#CzY{}do+vI9b_SLcvJ`WR+x;Nwyu_j|vl zV##lVAx9I_G4k=4WEmPmDMyqEd3H7=2p;}cgBzSDR+u0k5sR>$Eynb8J9rAI=^lm70UBfvpY<$2+q4I@=sq{gD%1)6E z(J(MXi3I)cz6bM=JF$uWPn3xGYVNMNa3nZ}g9%?K5O9bZGqrV&4Jjk6n4b#{k~a zaYO%jWJ2LtkR2K>?h>oumLk@wP!=Ux2Qc(2+YX``fo8n2&9nJ%Ojno`t3l{H_0Iq) z!4}uL6#8M_sUN+;JDAb)&MHSSHyWxH=#{r}$X+m01pwK*Cin%8gY6ZnHx=q^M{XsYAc3nrGlp$#aS1J`Qso zh)R{d-gvpj&vfhSR)VyKGy1b&9ECxHg^j;!FAM8 zDkWg0WZf5avFH*~`duRL;RbsA{evW9`E1v z63hFt{prNdzH|sM3;!x&?*#W6_cN1ymF)Cpq?HcD=V-sf?vKw2DjV#dfj1b0(2wyW zo_a%nq=wp3n4o*&v$gHjx6|5E{0rJ6N7+k{9ne;{r%#G^$Yz%DZT|LJ=S`H zpQUfK2hVe}jkq@)u)4Wpi8yZR#!}SzdRq#!=iRqgMPczv&spXiv8-F*{;1sVEhLuf z3cNcS-O?rHxq>PlZQEoFyp(r>ty1d`dv=(JIJCRP%9$4MZ@*;OSOzV$`La~|ZH(d+ zr0v9J@U|^ha9uj+%ujvb~mLgpXRV1FFxn_c02d+bf#>_+0gx#n9WfvS4^udknZ$A&5IWeiuA zmB`C3UVxKyxMVjwR*Np;^)e*l@J{(F9NBTX3ky-UB6*Ggb3 zXYPbe8{4w>twt4au@2p7_>%b5jC}onfR*#>Gss^8iGui%n<G)w|^XI!|bep({XGm*qXu8o2J>~iDOdKXY%RB}ee z@DIFX>Lz^~l^y0BnvEu_xbIwc<>xbpZZ^kl_Nb;$MBwDer1UXX4y1R2N&Uq62b?Z?wMobc8eQtRH^{_iBg?)`SktK zWGDn)SsW7gU(}Zu`UU7aF7{t1FZi#7B&LX`yOI%Sn!}+X@$GrMGZj-$Fr*gufy#lBmtpsBF{FxTUwdo^tr*{owfA$%K zA

B3X?Y*_~C%#?8IBXbndWTPlq(v*;9$R5_Z7NRMy-NBd_&DSoTEeVNOWp)!=x` zAu}y;iJRm!si+2DMbSIdGbaPpxZBFBk#YY(zQge3z4;yUds920Mn`P@lLqzNWwmYh zai(|kMj+dXD%1Z`ri$`7RLimT;PCgBww{ImF{+&?CKCSjwX`5@n+W+l!{=a?Z+Q2NBrg>lq*&B+zX;GOEd8>-$W9o=&^_bJqgT zIoqK!uePW24JrBuoP5FL*~}D}IoSc-uD7cGMV{(Nn;dbbF#>+n)Td238{!A7R6C+j zU?#3J#Y4l5p?@`R@z4pT!_ji440S;I zRhqLeht)>+%2N=hC$>Eg(_LzdwXbOCd!qN`C_3m^4}Yt_Jwy|=lf5DFyhp4&p7coA zGb<0=v47aO#@p&(wrY&euAXb6nw5%B9XO;^tG5BcIrDFP_e*3)@7cc2u{LbS1VH)< zM<5tivp3K=6xKZsJ6rkH&{p)!M_>EQn&MB1xg6C zzBrr(dwrCDxn|YuJRBqlG#0X6mN^%B|BKR_>}Y5Ai~rN&mU; z;JbiN;g_8(!|4~#D2s@1hmLQ-;unB^HmUdtwA)k$312UA@pv-@z2Z^kvC?8cY&>n( z*XCX;sP$nX9N8)W%~&AMu9-_J%D$*S4xZVDarPrj4$iEJsq5#YjYzr&g{-S$3OAFcpNcqkOfh!Kx{9nCCZWvx!80sZlGQfsjEhCoOXT^`aP&|~8t=+8-YQ=w=~vlxXY z>H1k{p<8urC2udbm}9BI#A`TDRmoJ3*Yg$Yhg!U`7rO--R7=9;7qe1`BB^ZEbSlaZ zM}CENbDukC0M^0+5>Tg3b`$22;id$#S#hT1p4b$W(UlN$GF}qdMV|&pqmTjPayi06`;pdMK0LF=w9@!@Mtvjue1F<_No8j{3 z=g970mi9B_+}$a!kGettzYq_a7}GA#R*qN)ArH4|;+LvIiX+;Cf&&DzTS4MYJMjt# zAVo|bl)ebjZb)`jfd&Qw4&PfJK@OR7>UAV)hpILA%jxPtiaA+Vfuad!K+T#+eKXKL zjnd^LO(o1*+6OX4p*lLNL1#f-nECYfG1Ov1d_9K;aNhDC?W`lV9s&wm55~|Q##H%p z1f^A%@fbeuad~LHa#^u#ryFgv5}r|GGZ}xCK6hEFlA-6`5JC7id140mNRNiij6{@A zE1o{@Dn^g)(NbhZEyeh!Saw3x%OBGCn4^`1^MlemH~U9jm^@HVPZrm&RalgNF08H5 zxy?$b0j|Spp*}^^!s z`h1@c+uwaB4&;MG6FJ#E9d52uchf(;v=R2a1oT99$+NT=Yj_;XLThb11$2nBLh+*A zuRKL`kg`T*Q(}9wfVv1ivDg=U$hyD z(nK5A#Vp&0Uw}y@_x5}YCjK>cz-AGWmj{oP9h}`2iTP*=h?xRuq${>%4-a>k4Ck^{ z$H;E%=hd5qt2}T6mXED_2=rgUmeLj-zvJzs)jA=3FTw?68`nuSW~E(5zv~454${GD zizL8@dpHis8}XfB=M&}lH9tX4u4f}o#qXtbpoarTH)j_o*S*biOPCEo! zAW`O=?vfIR0~cDy!t0Ml?h&fH0~c(&KVfc21Q5i?5C-`ljT&qhVzQpCNJqwY><6Y= zy%Wn)@}N637c1&=B%;as!?6;0n?WoYHxosATd*(O8qeBGUwYxGUL4UY{(OWt5^cSH z0q2b7+_Z@?Q|D&8u9uSVb^qSdp&re$(Y9%H2|Pmw!YgNxfX%uI9cVBM0&x(30Mw2g z2<`M7Kf>`N*<~EEFfxgYLrILPS_8~eC$BIbCqqL_Vj(y>(RAb7N)*SL+TJqsogw>i zKq}H=yK7E60C;}#LL%r~G8qg^E>NlQD%bL55Po@fW^^;SwvUO1Epy7VtP|L)cO(R- zw@cTeYpo?s8)n72ez$A8_plnR!j!by{e_0{=SSL`VIrayW|acby$OuT)1#j5k+ck- zQTt(v&cbv{I@pFCrA4qIY*=J-5sE}`Fj-U0p#E`Ts{*D`9{VC?Sz9t`i*JNivjyZ- zq0nNTc#30}?yG!b047OWb!i9+iC0Am(ob6R@fB}|CM11(p-;hH6M{H7SrtV znRx#Dw!RPL<>AX?atior2RG&k{K4pP-;?rqcjYsL@Rs!vuFPk~T8&LU1sL=V)g;^gY(p z`jkGh{X9)GH0A8m>eLw>N*ZLa^XyIgtq#ohz>Cp?F600<89zQ(V{{gA7JERO>cy*k z&>7hO#NxrAkGLMxY}y{UBf|3?W3hn!_Ar74U%m+b0i!5If>G6}{pvwX@6_3%YY19_ zSWPcD_y!S-;p6A7RoFH)evb2F;PDXpX4jqb>wMr)(#vm1wN<$T<&>{*ChKWIW051p zYpWMt2k=Js9R#BYJ5_iUTVX zJ2Mp*r|kdp?B)A}-*chCOqM`aO(%)@jC=^6`wBg=BU(w7$F*z#VomA+sQ^rHs!I2L6rL{G66l{J7Z4pvkIAS0iMCNsSGF7e?2bWTa4BA&w-Bq~X8%K_VlyA#HQ=M9FJ%=Yyod|m|Wi)(Q;_sdm3{mVNqSnAyJ&tF%J zGaK$PiAI@u1jgW;tqc|%2>o!--2j?(Tqc)4S@lvI8p%c269j=S0zliddJGXs! zedqbo`TpoQ}N{}Pamu##oLbSl!3l%XfB3W}5{RATD4Wd6fUkx*KE%E z!%JiosTU9SiK?`f9wr?ui@^K_3bUx-3q4ODwMijCkX1-^pPvU>V{GSL&w`KN?mu2W z{Q`P~xAT}k=inRe$4|Uc|1NZRXCsG}q`)!zTLmI;rm$ivV~*d0{h{Bb!^<+1LenJ{ zS~Ds!2T2EWueTusn0ZmzBp==v!SW=yykvPI8Hbn|GjHuo_Y%krpMHwoFUD*es{#Lc z>kXHTaynh}1Yj3}dum>4frhk$SdQ;jRcgg}+6qx59=N13#NEPopC8@weKwL_YgfU9 zNZzGdZDU;EhiaIszgBrVGsVLNKGpPCrO5H#=w+D%6$2p#3Ge>9acUzO7*$U&DdMgM;F z`iXA`nmJJ6|%8MvkiE(wDJ?~tF zaCdJF8umu?)1Y?5E5F-R_hH_FAL^wqcl6~H*9t;1c%;up2E9l^5CrIFq!?r*!yQsA zpfo7>Pc~N}khs_;54~G}(qw8%BKO%DbwniBMWR4_g;i`Q*Gq$lRUz})C^KEPg+zf# zPlsy*KOt5%Gxt2Hl=y5S-9L{q*^DBABa}rstIlr#Zgqz`BUMEOm99~^WjyMD_PfQP zgb2S0ZL-nTN5OZ#AX+z+-0P?O?-75d!S(&ZUQ|^2mk;~hN$9X@ScUi9YElXi+aG5c z!rk}rmu|?eb=25XqR86F{$5w&*o|exYXz9X-K}C@6(3h5s;>Ah7bPFiC%$uw3yOt^ z8U=YH=1?FN+Wlisv7a|xWi1~psRD#?3mah!Lx&6*=L3{2l83a}>#TB390HF;r0~Mq zZ~OeWZGx?4Lq3rx_3ga`PTTQ71b_IihpT(nfFxpimj_1kAYO>AO893GWG|$-0)=k~ zcl74uOi@! z6SnhB9p&*C?%Z5YIJyI(IZ{#FTz7nd)&(Z?G~=f_epQiPXWERuq3O&_tUU4xGuRnYa$*o&(-c zFK~pr8qJvrrWf0K4gtBf(B2peX!W@V&ZzpqmIHsdjATg$ZTb)l>(u$DM*#f%@#bJF zf?B?2U=sLcwI)_vd3LAIfMb9<1Mde!CJ??4Yw?B& zt~(b7j4BGQv)rsh?ftFBOI@FmV2IcbYFB~sc0FKn`8~BbzQ}Mc3Kc2x33n=SwDZw- z{d+(>3cn3*>++>DI4lM^eilje?$Q6gg)0>VW^! ze<1Zv-KPGU@IE3POzQTIcrgGKQ(bLPbNSy@9P{hF)b6)x%*A-jAe^HT6l`EMs2kMT393{A`)FPq z;uUu_Db7qucgF+fce{;FRBKIp4A^(m_yX;_L6b4eAS+_rJ}5 z>D5Is^y)Ij=*_eZ9O4#myx~_3Y6JOR!^Z;cnQvdK(tJ2y=eIuRx886L<39-x-1A* zNb>EzDcU+^LdCc{nG6@Go9gaf`^X_ZGIIRFX&v?3A>OCL1=~&mH>|vS!O;G-+TJnq z;zUxHu`vQieMSHDCG1H15`UP)Io5PPguJcwdcJU8+aukAKD&jZrHMY?PT=pijGniQ zUYfh>`~p&)Yss^Td?hOv2$L{m~-8J%;AgV>8L~a z?~_?!T(x{O_7(`84^b0-=x1}v8HYDYy|n&2J-6L~4)E41o-#BdLETfi53ML$(sMf1 ziy}E;(@=iX?^ZjrA=Efm8(0!E8(C%tMHUn%%7=ij&;9L_ zp|VfmK9_vPcVA=(mhU*=)qkP$+sghomjRKc{z2g)y`ONd-GdCuvy_llm_nmIvpl!z z7qC}v=-Va`_i@*^)3q%4&|klu-Sf*S-tig3b@qs&fpUS+B;!~C*gXzydnGU~yzU?@VA2coYf;%{%!pDb3mz@&2{ zGe{5MnKH)GxOi`0O9+Rg@UB;2NC0QRXOO~SquoGMTtQ!e_b%NE@s?$emY@IobOPYb7odd$M!31G-x{kkZYLJmGqAI6hlDTud}$y?@BqSR z<5m{JdzWB=bNqK_t;-kgBTH0!X%qQ>jXu$PSica3r9}J*vd;OQQ{^ij_y%43y7Oyv z^|SX-*%-3nfqtngPxMp$0-~N2CwLAai8?)(1#y95<+l?88>t7~?riT40vVai1$D?#7C1LYvyg|OXg7l#Lv4kl!kBmU*q@g+pzl{0{a zwf6wkf2YvOJ6r&eTPgm{k9owm=j(es#kBv!n>$oL8*-y1h5LrXF8R`>4DLi%r5qUW z$zj43`P9{bO%NZkVeTYWw*OeZO?wz`ZH zmG2fsF;lQuxVjP}n!FPNoMaE<&1>l3b{~EkVYCcaZD|g%)#zNNwUJ2{D172-kK*RN zaBq%KO4Eyu=4-tuj*a>cZS#GStPjlvmtm*!n=4SHu#$Af7Q;!khisav&BpcC& zKiowuRjLv;&4VMfN|t`|+83;v`~RilKI!=?z{ui(H_XhL(u__k{^heIZx{DKa=!;U z&f36rDmV-Zow#Cve6&qm3aRa-_!YU6J(0@{lG1SYm_fEw*SKK{(tAg))ilWCoWmu~ zkeAjxYp;_H-+qiC$vagVVRFNC2EG7XTb6P5CpJ7~8#fK~-G=wBLXp>G!}1xkJ>d9Q zRhxMp+=m1DLS#S0uYcGB*w$vezreemK8Po>?+(zpEO5;wfV_2@Rr-XN?K_HDp^lhv z_R(Kh+_f7N%pIEBgNXvQnu4dJ+j>RM1)Jq>IGxBi?rv)`;PR+ZJx7q zo|76FFzo1u9iV#01CKw7~#x&xMc%PX?IOw*&3!(SAai0ru9J>n` za)<0apRtc|e7(zaLfh{SF!m;UY!2wZH-7!+PLqIx1;C*UzbRG!scF;rr>#+YHsM2s z+}h1IaQ`*w+CTP;ki(++M$Bki|3b)lM=Qv8af{#a@7B4q{NU%AyB z?S0|~I^i|?4NFH2;zug5kMYZ}v@h&Yp0gpbi+}PRPV0fYgW!R-Ps-`rhEJ3B@V0?( zqA|F++mqKfCh=xR1M(=KJ+&(azuosRb(}wKMYwG!`$gK|a*9{TIC-4g^-0L##C(J3 z{Xv{4VU(b&m)%^f_9MUN=><3=^cvI)9(+E5e@(gX>9C<=#H}0{wD2P^rlk?_FOg^weOgGpx?Gts{JtOi975jCUUWwkAD(+ zu=wQLCUU*$|J!rMe&VlKx_wfU=9BFEWd{EIFCFyMb2s3*X-O9ELkyhRTIcV63UO~0 zzZpakjrZOVzE~gRx>;f7IX}hDegvYRpc?WE9<4hO%b)gd%GbX3xAhK&fOALpg_y5^ zi`#G7KF!#*=aeJe-2+$6Mvs8Fk9pLK?yX(b>+`nnsNP;D#;2M@MCUNbPuAB(MsUD~ z!6Ku_tN1S6eV<$9-1qiLeBwV-WYRc*u8)h!?y6{^>fY(|l;!ou2_cb4_*ua>vsv3e zy^mR=+t0(-Ao*m}CmMyb-q`g_D_$>Rc}_hlnCr+$)lME4r0a_YvaQ8R|BWK$ii!HeRpY$^Tue9{UOhL|Guqfu>OnE zQ0eMvBOb?kN2C(}Gv{mU;k;~`8THAEgHYbO!qXwDVM^#h2H49j-7= zwno%%=ZYGLnTop`;asi3dggm~ZKwy5cOa4iA>gc|Vzk}MUI_rq_QWmi-Iv-%|wUGNg6gjmlD81KSK!os-O$?^T zAVX9mi5$|%4CVGhXVUkI;FQ)ZqETNo(e85cU2SaacFDqujoB~>Bi1S$1 zAN06yJem7`+z{@Ub0G`eC{1r$5SsK`-aGdiPRdH%=s*jQJ1N+uSpBgO_s(i%#hdfkw)v6W=+k5=!_QE+(% zfvq}g{eylbiuSs&)PHM;YUh4fNp6mk7AZ`E!F*voPIT&oR#as1vGntO&}iE`BrSbXJHZOtvk_ETn{AqPfBEaz^cTkHPcrRij~L*FRS zAo^rYr|f`c8*ooVnVEp*@3S3!(lxIN6O;b%Vd6K&_7LwU9;$??KXqV@!9l<~jV@wm zY^S}R!+#EW_r7z3t!(E6Up_i*iai7zy`MBv1WCe)f`{>zvlqROTdiAfp%?uNqg>dZ z_8Z5-X@V!hV_P?t4b(aJCY{nbYrQp71xbxz3VhVNype@E*=tuyy7IEW3)NR} z92a{!tJEs!kYo7HM{F#9EnsNzbcb}gMHAG{Pd6yb%Cc%Bt=ZRZMw#sqv3|>-`_(`( zn{ZfG;5h(ad3%%6D^-(RX~#b(My*}6KJk<9(1(E)3`Z-uN#w-MLK-^>BIlgOR}lNh z4HYRE+Ovdp1=!c)xBcK;izEH{mm*L}h$&6)n6f{?NpmH^9hn>B#yR6mgC)FhiGziT zBb9AAS2kT0TF#JLF5I{>6$o)3Z5kxTl+rvDD15<}*mJYxbS2}$z4C2B zCe07R1X6Fv6&55LSfX85sJ8C+s5>H^>XBBOp8AAtEr1Z$e(3_7^qKgO|71$J!vZO= z^LCK$;p*${+lcG5q}Hd_o&h_VhX!D>Bi|&l4j4=3jV!Ol4{&%Li$> zl(z<=Z`?^v9J;TlLc{3hdfO}dMj=K%c^_Y~O;@ZIz|gGrX#H1m>i6S>&w`#`n%D9V ztK7u&HzSx+o9dd24r8p-|K`$HPM*8n_`}vo9rMW>?&~^!P4OJo1xB{Z;BwQ2#4@1= z?;1IHt|wi1ND#zcUNy9=)AES=Fl3$$Jn6v2jPDLvTUBC)_1#d=(-@^2%1&-p@hLRt zu{sEw8w9v&-8K1yJGcI~&}(#Ky7HPSbLY_R@>i>XW8g+E9sPFN9w}iYf*`~ymppZa z{-i(9b3%(x486$$CQ9OhI?^^7|eqTW$#Bm`M)xiG#Ryxw}*!hvt^ZdQL&a-aHx~)NW4SiebMCqC% zU%o<}(75@htAhUb==?{2k{AVuif+cwzMo)zlmUw4sb`7 zRvU9<>eftyWO<_0CnHJd%xBe}3~@vui&giub8Z`4v0S5H5q?STvau|q=}h2fI-}t8 zjVW@)97=q`(xgI>v!(!;cG-PdopT(qigxbg%aV7=_{(l7+w*<$Nxc1e1tk7S0B9TA zws%~N85burb<;fL?U0JDbBlwkYK)2yi^$O+fC<2o`sXgqjwN z6ZGND`%y5ly1?tk%B5F1n3SY98K@1ms~!GwA-oxJX|fNY+H@ zMr>6ZjY@*6IJHE*!7DjU;t+6gxf81T4` zCe=j&&tl&9pG@h`jA1WNWOT-dtU*29AJXO%6+hk7Xx-6vwp_%IB>p5D+-rqN(_>vm zPeawmo5U??VKBZopcJKa3e+-lkLPPy0^e1b(&H~Lhra%HO9sqk1>|(Q!v~Rj-P!OK z85=rF)2LY6mX4fuP~wW>{LYbFdZ8kqGnUgjhjtMkZZ5&2umo`eCFru>gY;L8BlU9I zf3^*Cxiq=mq{cx)80=R6A#s~5Ecee68^0yQZ)jJfuk{n+7j&h!eW2=gqOWR?ZOqVj zF8kNnph^PIwN}FqUxOWd5aruWM~-epe^-($v767aUvVHFKiDNze`}hz2~(!+H-53n z3kUSBYhEOk?)an=)D~-eD!9TTiekX=%4Q-akD|DD+JWe8eO3OL7k!~@^Y!+%Li>zk ztyT}g*`P*6qaN;=`$bO##5jsyT(`8!rp9kSKTY0VCPF?v6}dN|eXVR!edMj_haP=7 z_{!6caQA%p_;t=t^1Z4s6{B8Oi&X~va%6pB9&Ht10`9N>8~-DD#Xk6V?Qpiu0(w#t z!2$d|u%CjEf40=01DiEi@*gJf)WjGWpvN zWd!xuI>RtNC3$Snp^)l>tyKw5`PrJHzGT?_M--mHax_uh8YB(u*3mUjh?56u=ECJa zIKYidj3iz=Cki0&2e+G9i588^^dhVo0Tx%i*HB zrVCmcw`-}6^YCo%ThwZT`KRSS-7X+4j7xn`wI$OIg_k{g!O#TuFb9PP>|{Kbhbc8QLKP>Qi%#~Qw!r+iV6Jwyqtkv%$a zE}>vU!Bjsj38v|+0xubiWjn1BxBqVBhSP4odu}W;?UeMh1#-8zWhC&gstwCX0V);r ze6U9xbx6co5+8>lQRPyM!kQbI|4ZZ_74&@YkjKO?l(#NFM*-o_W2-OfVIp^4JK)D> z0tK&1kt^$iW@z01gL{ebKvcc7E7ak7Giy(!j_Q$Z0M-qB{4nm?H0rsr_Ei+~t-WOvYL`_45&qg8TFQu>vxkR8_*rnkkI83Zm6?J*T;ExLu@Cfg;JR5; zXaB(Ie4$igy_E0Q5bU^*^ zKB!+XfSrIic9#qNYv6ge@z^jmPsr()fWx1422d%jgxTmbHrv6R-_zKCHQmTFW#Sz@6}~-B?o^i6qeyYMt`I$jh-E%RjIStqklGL7f0bT#E z5Mu1)Rqc&XBS4+FqtTvr46lDE4cK2a57*z>1NTUR^&6>5p@%DV^R!1?7nQ6tq1UPn z3E~9BcM4eXZ#!_MD7&f_t&4(0ILD7EUDd3Sq=j&l<< zftpog>gKpD?`p)yxRZ#t@`=Px5lwDW}$cYHKDA{k}ox4y5W<)y=UwP^T((U z?bp!L-ACTKk^eirouk&*@>8zz7x>(E4$n*b%M8e#{f2UF=T=~tXK zqHOjzEUn8gz{-~$d~IaDPkF>&dU$TGms+ATN_<|Ty!SW#b{52!F8eyUua{)>c4XL- z>#5uJX!%%R^h!}G$JS#K-$wdz>C0`M^fJi_D zLWE>k%I0En;W~$bKgsC<+g^*Ru8YNxmMqez?V2LDT z*`aj!L@FB<(%WU|ciuBLXqo?5e=J-jfylSpp^@O>BvGxobqNqJa=#sf6g;e}WMRRE$nX?0RHHNAR|5JA~6??lLT2@M_L_r+X~3pSFEI zsumGF{$UbVMhzmc=bsBzCxfmk!!am0alnB4BZTM^_;uo{9j@vg^iN%f$53(ffAz=ItU^;Ma~gq0V#0BWz8rMIuL$d6M>C! z77K!C!`{qg~N?2g=bdeMF5ouXqsTW8LU!B(r^6mBOZr!#&ulP`5 z24a}Q955p@fA791PG_xU79=yuoa%g2;yJ6W?6Y#f*&mS;oDs3x;~08!@RS;JKb_U;<|&dK>JFQy%`A;eIR)R95KV5t194nq1H6j5R6VR}aK>^UJ1 zI{U0YF{8V#T+d#FIWbbt|5>%(LY}CMaeRY3 z$tTlr_k(kGoHP+oVzKouvNg!mH-#GhEACYSldY6!ns%c$W@10J`8Pd=`JwXua~12X*EijHcjv6vd=2L^A2Q(3ykT8n zzmN-@=BLM0r&SMF!(Z^Id*BoHQ->Ld1xWD|&DLc5yi9NXulF9uPw+^xx`R!4L4F0` ztYuu6N3eA3?yTi_Kku35?Pxh*Q=?Q8ok<4&`F~j%E%kC=aw&E>i9hthD(=uas#>#Fg$EtZg>_ z3b-|+oO$w@Bup==sX2aaZ3^E!{b7vr%rL{-FaEoWAsbGKdWU5IJ7Az#TIuG2m-?CK z7zUIdLjz1IgR{30M$S$zb!6z zd_7vB?{{;YRg5aJk^8v9q|^j(M==Z(En0i^-CD1_1U{-cq}IYO{Y|uTkI!*d8-4d- zE`#};(obyf7wjo#@Gp$Bq5cR=M{Z`uTp+v%phq{Yjb{1rJpiGVE3zCK5rA|oq8l<-X&-zQ!y^8(K0NZcnZwtwKkzGL$}~X ztUHGzfP1agZSCL|)~;12bzzf71X*cEGZf*pNb40xTbUxPa>Gu}^Z9g>yQ}cHvpEHT zWxHq&$#g%T?)H)&SD4SI<8^C1Navofw7mlf1Y zrEW<|mf4l-o*Ka#F7;EK)jGs+MQd_QXZADa;&2QvT>!FwyVeV#Gd?$Vtb^BHGoY9B zCC+N#Kh9?`D8^@TR{0miS><0CXZ0pG_pT)tGSeg)$F4IYbG_f~&(OSMf$GIfs=nW?`X-?Q2o@bQw`HC0KeL$|h-7aW} zi^b!q3=u5u@>6r(R4aF#r-H+8#?#F;Z^f2gGy2lnx4sHdI~b-1&!sbq|U<@E_|t7tq-df_1C7Fv7{~5R9ALuT6aPp zKjkTfvjFCY`-rb)(p@)jvfga9&2y0Hwpm@ULjo`e%S}d%Kriy=EP(tC8ZbPg-tiUJ z9o^NyEQi<@z1504TML$4H;}p@#?OD`o3r4%2n@LWLX@YgN-Cprr{kE&*1+8z-gAoL!Zt`cE&dH~|26`4^qb4n{)YE|+ z$L$%(3eLeVjLV!(`|C+m`#qDgc>slVMNQCt+3h{~c0JmnYp$hrD06lzuiT}(J}-!) zhJ3uYoWVa??--xXPX06b19kA<^7k!&zmPw^{{(vg*-^hh{@ic*`euquLvvoCMTc+)avP#8j**zjsAqr;cLzSj+Qhn~Gw+8+2(&V^x=<0`kU9xq zU)>30xSV9Q+`2Zg;PQ+I;KMkN$8*T3QsR~Bx#e0on+{XZc-K=Ti`<6EOG}pYoDCaD z@{r(y)Br{llLDIz)Wd$AtS4`)_9*a~{L4AKY7!P?dQ>xMDOOoyp>ukJTLN*j`~mlm zt3z&i-*sCUgJ*sTf zUg>clRY6dNOxYZq%GyGVtwLr!2g>lY#eYd~msm;+lUP{gAg?nkAxR(vQ zbhW}j1RGyPHR8%R^&K-$6I}U zyw###)v@}aTzs>2y6ZTgI~dbPn_( zb_aZG^;>xb=dP<*3?DZ{enM)M8_3KwsE>-X~gKpZ5OS^H3uN2%o+9;2h|r@-M^3a`DL?kFPj`Jd?1$ z!R~s$v%AWqG3wJESQR^vHCG%<)Y0IREQ@qb0B1-1eXJkuI6uVtC2wN=xKm?J#s)>N zM%i!IaoKcvPaQm^H{!@&9(o{8(LQpIz|>t@}>^D`}9&M@MRIgI1X`O)ZG z&TmH-8pYMUz+dZ}+^AZi_dLPm2^NBG;;Qic1Lqf-`!i$k6n>6@)3-|vn&I}9>K-iM z^ez0TU1>Tl@r);)Pe5LIl|A(}aQYO-08Ss1kC$cb%v}&v=;gb^7K6~I^LV#!&*M!K+*H$5OX++6LL3>!oA>sT0CF4PG43)7;yRm zd~ zT#wgpsS5Kb1?gg^+6s`C8!DMV`~r0iqyu@1aZVc8*Z}cEvSE{39(P(gTv#gNYIo8t zoWQs1HL&{CVm}VXfit&M2b~YHpSkc`ysI3SEh_OO)@S(jj(0bUTpd>JPTz|c(gl5U zKJ!oFM>G^a2-BVkF7i*5{3e%w-Xw!aB^UJ(bH8HI9|{gj?FK*be@V8bH`YFgI=~!~NyHH(yU2E~v z847tSuGskug}uhtThg7+P*{fpFum}Vo(XDyj&UBT&N=|od-M<7s9AZu--glXV)Gda zf|Jt~+O?5;I%3_Pl{S$9iAz1%z_pyc!yNc>F@=4?Wz?a(V~%WEX*2-59^ckEo2vA9 zN|GnjOSOE)R8p(m%0^lk_U24FL9mN$o~Nmt455Ro8ku&aMxofAL#|%0hNT=M;d$K3 zdk_d%;=sVMEFs<6O@%&b+uamjHHb&zqyb+8Wlu11e;vTYAom zSXGYkVt`M=@&t6sG{6V7*^2aJpAq>T-%>rDokheFzX;yPST$sR8f(>NiGwIoq{3YE=6qdyM^l=WUjdZg-ppjf;A@z2*WC24aYxRT z=%J0>(OGqCa#nt@c+j&Adpcxg3jt%+#g*2yka zx#1ai2stGYC!qXp+Tv78@zL4v^Zp_wvR$5_ayg#&7a4OZQ%bJ3XLDDt7t``;Lm{?W z$b3cQ3{ZaLYbw*i+&FQ1+~9$Hg_}hWl%HD#1yFu3uHP|XR_FTTyarkL8SX&80C)WL z=acIp@jK4tm{^1klwYAz&B5V)B$EzL%e?vtG8s%S#M=qI7F+d6`I$iZU3CeTB_MV} z)*h9A&AF&?5H1Eh6OQ$=WoG4Pp10zmxA}$QN7bzSa+P1h8TxvLLQuG}u>i_%$(@;v zeI}vXSQ9==9Cy#0OR4fb#RKJsb1U&Y;M-%L6kglnu$Lr+sKRS?OOj7%#Chb1q^jR^ z>%#&Lv?*&a=oC^aP<}o8NFy#<#t^O8oU5eWk+)#&s#<$jtyR9EXT`mPUpa^U>3UX|fcwz1dVf8uiR)g~)L7%v z8+uj?`TKfS3;Cz(S+zs{p=b5(dR7UYzpkkvzBN<6yu(cS@}4v0(T ze9TXpE=LvUkLn?>Zx04h`zS}jL{GZ4)Z!4qgRweT(6&YVrPiuuirnG23q5*AKFpD0 za~KQt3?Dd6OylJ%{9V4qpSa-<{t5n~6@TZyhQH_w{^AaO@y;^-k#|<|**ihd}kSc3BV3$;- zD#5RN{S@yPy?*0=(d+jz+eQNJv?IRh^&?yUNA9aQ(B%EyUO(fNUO#aSuD{^E22kxL zS&;nh`f6NytJi9Ihnez)d%s?*gZg;ZlU%tkKYKhcicfl`q^WcdQ{mcuc#O&m>fS&U zs`1VrXDLOZ*h3D)>`8_l;sZhRO!r`qSZSyVsW)XLXe7o6n6F+ul6a-pkN8Ee-}s;O z`n}8-ov?x}zUlR&sq!b>mq-leZ};cLUsY=Bsh(P3}>=1NV5x zUaNm6_YNxSwy{7l2FKoZl6&Y62#(8x*0wG|Ubu2MT)Fh>45JF)UylC#E7LUmR#yrZ^$8KnN2Q=5QwT|E(A?bF0P584ED?0C{ zYPo3|Fl0b;bL*C5u5;?C$K3(D&JqNB#p0vc@v;xRC7+HYXJ!JD;S?46!cPC|dTNi; zGa)a8;)P8N5<0&u!a*jB39~A__7%#RjH-=g&PsBJ&}V>+uB{5 zyHFsNU-TQ)ggDKyocdk$dR%&=*J^o(x$;Ha{pq=vJ|Y(my?`BR+@Cmzr?z3m{@!W#;P&fsY+Z@erni`pUp4O;j^V@YIP2xZ$Y}am)WV;9C zwo~;HLBidjsuaWNL=&fJea->8G?cyCY=h-B=t~Wz!GN!wk6e@Q-Mkd3iPKj2u$T5R zkcVH~`6ipD#tuJr-K*!$%NxB`i}d@wR_kYQ|LM8Qo4I#4VDh9BHhtNM$FF<+?orrg z5BytA7r$%dZ#7-auQXkj{BAGB14fCYdPw`E>ig<3pIrIjB++I6a_*x2qjMMZ{`ubH zV4uuqE%A$_FqHUHEmH#q#UC|YT%OER@l(%1Or6DADnIocuv^aoaN|m{6!j=%zBD>B zF5svXc}IV$Yw+A>?*m5Hlds|Lt=aPB9cIfH=|8^r_`u(vi$Cd2{QW-nkpAO)j}QF) zvG{}Ey7!RY;od{~kMBJ`;jb-W@fY~x|0?%2AG_#>dk;4HPx=lL@GJZoZ{si8@Mr%n z{w^uoyn6O>+sbKGN_md0|X>`1AU;2 zPdh2yPuc-OZnqaNRR*kNOf)S>63c$(r(bBB(vzSKNy>}jEU>`Ay#LsH&`&Zmn4He@ zjHIVxPDh)zsm9YH36D?rAAh6wV18X^=%@9c{&fAu5(-RtBi?nd-pjrwfrp?kzj3o36ciOw|It54172ldUU*2Kne3AeB`;QO&{YUtd-o&5#4){wy@b`hgpW^Qg z{sFy%mpSy$yv+X(d!Kjr^#8^CkKl{e+F!z7yW#Ke&7Bvo&YhzB z{j<&~i+`i}@-%jdwCedtDc$*aVarS5anv)ObR}Jy0~(j6bDeX^{u18*uI5Ygs^-g%d@u(9K>~t0jAnX6ycMA_zC&AZ z^EKM(R@c3z@vOcza}K@3%sC{!qu$lOl6$ec*Te-w7aYUY|GRTXhyUZbqjiIH{j0f` zenam{oqk{MN}c3CeD0_sstgxRT};jVe|YX_`ahmK8WO*|zaE#$H*zoc`2F0=&3}0A z4UqNWPZ~ELb^d>M?g%{p-_9Ma#c9_aUW-ff8}}ZN`1^fV>u3Dw_a2C#66X_ds~7E? zzJvPPzJoE^G{%P?&s}5${Z?a~{N=gJ_~qQ?9tAJFxBo}H_YVHOzJqDwy>#$*G{)_3 zHO5aCu18Ti-o+dA;vmeQV|%dWV^FNLXZTy*AEi%+bDd)V;dzkGd23SYBon#;n^d6e6yZj_$sP)BS!nb__#rN12M&Tw@>#4W~b+- zQ{>)NDR6S-gPBM&CZ$BuN{;5ztPX;#1THwylazY+A7zmf8zztQcs*(@wA zK&m6yb^L2_NqWQMLprI@?{i=E&(OQVSMGcM8TSo?Sv#AT<;-7^ROtb4@*+&KcHyp1 zRE?rcO@rM_%LKOaTHH2^1HZJ06x|!TZcN;GSEN)nw^W4}Rfq zbiMzb+^fCeZ)E<&-w1iKn33z>8%;B#nM3|Y84;Xo&%V(313x+Kh$kQeyA-vH-x@>)O zgJtcLTY^yZxPuLbr>;A`I&wSP*Gxa3pdKD}2Pp!dQ!m!x*dVT{cVJLdAD2*ce8+}t z_OSUuaz*Z8M_Unp75lgx3fLWGoWy(r*X;eI^{2${3b{{Of39rNTuN!4#VLpMMCEB} zK3U9YM|!haxP5=_;-utNy}ragYNok3;J%4{PZl%z8v9`Sd!76BWxf{sW*zU|zy@(-zk9{WeKK@2O#6Be&%6)9jUPLGsXYP7g zr81s-HrE>CaK4?*Fsea2xJF&GW-WoSVs!5iX(o)4Iq7N}Q(mgeOjTOvW{56CAS)*) zfuBMj;E!W);?~f2j0mV7&=Z4P;Tw~I!YQtDZdb*sRV>0U>OP9QohN`S9}71mYxD#+ zozoLqt?BlY&guDd)hLcEZA(9a9QoKhrK!zghF)X1Q8|M1-I+79BYBg5sr%F+qu6TZ zzOMV8EoQd5Py4~+qjjYN+`?E&wVg5zlP4jPios*|tX9C+2=}WJ3mSU!wlRR@ZQ*b85 zP2*YJtlcJ>RyT_e`1|{|n4~P~Q{ELgHN%Gdo4osE?Y8CJHQs&avCte|%eyCD=$bch z@doF8hgoyzpUs;8A9CK^-TSMYckb9fM&r5oa^DNSecww7y10^#%ekN0DS13@{t&{5 zmzLCpoL;=$R?^|lA)>u_yOo=_Ta81xN~seMKdjHBgR=^3B^~UK_r1|e;vGdp^71Z! z^}g4AtJey7hh8g0`olSIPW)BQ>s*>YM&nslKHv8)f8oBDyKyV&7#jb6t{Lz|!QHet zUPY-~bNb|K>7-e~FWx6#OKtPDOnRLs`4e3`$1kKKvz6;gI+7pndtZWIwVOn^x^%+p zap|pIEB76Gt-{Bj&3R)1`Kz2a?6N;b<9P>uzVB83!hLTJ74M+4@ztDfoM}I~?|mu! zf`VRbw`+#i;?i4l=FmILnM40*&b$!c&08>A6Iux-vsZMLh@l=%Lf_`z!!Ui#H+XZ0 zZm`osUAw7c>#(AS^ql-;WIo?4A?WBzFY9cIYa&j`Qy42!)!);dmg?dZDx z&TRdRF`}O5Nz9y(JX>pBlfTEz@Kh5@#^&#uLgE#=s|Yc!cpW2FOr=vfzx+SC=ScU+ z;S0|ZH}0Z_6;YUo1#vGu{OjLwjrBXP90uCfpxe;;=k)aQGd|ePHlNQob*0$dH7A2K zSc0}a@w881ar^tvYbDX z_Fv8S{?+eoBH~H??z=Cy+8h;3a4qc~GS~?;k%sJf+UZDDJx-OhQnjNeAImhKPaM~j z(ox=#MDBqKrqQLnOlWm6c9V|*r>QZ}WFlGvvNSkid$g1GNkHu5WUn0-r3?1FoUj)m z0O8ZIkBo>?dKHQAGI=bIf#?bTk2VMOV;J>2Yo0o2g&^2EP&(csuj#8(M% zyXY$=<1R5PT{+a5E0hzZVMgMq4d**723CnVdO2Iob%Y)NdQb-&Q~4I}UCa?n*!J5Y zZU}n13FA~5=@mwd{-!U2m*LSQ8k0Tuxl}*WKu?eebOyjFk3fTD&i=#>{&MA;gO3K2 zag7nk3_|84+{M`-wZ#e18qRLI8(*FM)t30MYgC1Q~(SAgeFX zlv-er5|G6nY$2iqfK3o*4_sUw2g5xWT!r;Zsw>Jt0_YU!Qe)i+8QLC?ln8t@dn>po zdzc8BWpVgq4@i4J1uW&R6nD^S5(83!gGJx>n%g@yi$3_lcIhfn9w>1;oyIw^!(xhh z0Q7D+FnI$k<(^vcrXbzrs!WJW){0j9*n87ji`!h8p&T`}$_xImG}^-u<&JlSRCR^u#^#Y-w$gMv(rQ@4md z;Co)%GIVmU%Nk~@m4^$a(%kS1X>{rlX(FPwVsA>)`(;itu`{pmp_&ZPt~*0Nom&Yx z*k^QaImrIJkU(3*MItmy0rN0f90rF<^z<=c&afxYOi|%Nv!#N9~b+DiytM{sjPa?}?hM|YkcG3>3Om1=0*B$LkZ1$j43 zLPYLilPt{b8Sf_vX2!^EiVCDOyA^xi_UZP1$yK}vEkWXwi_lE-p2l;`deo37?iXvs z=7ZrNJ!3X9T-9099A+|uW&M&=n;Ig7Is?;D>ndiNl!QZ77X@cnWhC63S=HC4xDl?VRMF5( zTq2dc^AxB}_r1}0tpc=_z($e4uHWMv;mV~rBoYtZu5pbj!@?76IbG$ULhj~cfh;#J z^k6;&>%Pq}s_o1n5N@NkB))KKMr6b+u|@JVUnS>AFVt?uEJx!R+SD)<8l7@qzspz8 zb${s(>$=5t-GzThVc`rL&+9g}b+`T1jM^%;?86#DyoisK!!0^9bPvbfLApdIp3@Z- zg8)}wOwW%@-Ji$UjSOXKkNl0fqHb_Q<)GJs8#6-4ZYZnr6fOI9>FAi*Fi3(nzUJDjEEY%Mx1 zfA4s6L#)vB1nyNLdO%l|HLVssBhd zBx_4mZYrz{vVsz&ZBpKS|`4)^YOgS$F|Nb`32&oxvtM3?T|ZN&4eIK zX@Y7w=vKR|=xo2gf*{Z=?G8+YJ+dd(a{Dxc7It9Fu9ZdEzXJU(HM-c%`(o;h*eE=J zSpln=Ic`6|pow->4*CMo+~IY5x-DLDR&A2NC%ghrclCg9PGoN#;a--|e z!FbCnr;1ns(22cn`%rtEbKT2jUH1*!bf%hZjE-jyu%6#=MMfdJPR+PZNN}{P7G&6N z7+DOz`#yUGiiM+C4TF|7hNy-gA(~G$i2{sk-lEI6xG?)DxM8%ve~MIlcztn-`M@9h z6m3mP(vR}>bf=&5d>-OC`y5*tyvFlI7DIhWu2M(m)(}{5&drwmj8-&AQOY zH_@xkMOr5?$S__l$lbd=%HKR)nXG=;budL;Zarft`^qbTLzHPzq$KdrLFe|s-A=V? zUeX1v5C%!drRa|QU6@2<4X))Sz3SL-v+;WU?N5(&Z>@>nUxU@{;lUSa4FY>Jb-FDG z?54+>!xzXTYkS48vDbK%ku|Sbp0O(Q>W0QLDRrt{z#?M^#r$zQ8nt74zY4 z-R$S8HfiFLetO3xUaaqUDQZ)lnXNV@?)T8FRuitw7)!tFHx$k*jI!q;jo zJ@7n*)&MX8NRaFH`eRzl5Y*g{5`#Pyra7QL*Uopj(bgdP^!)Vg`LVJmw1V7a^cof- z{}l7UT2AG_bSc(^I=6acKW-3a#Mc$RbU0)XvaOkthhp^DCcIzA`sip9k#Kt`s#_Ef z*9DKawcsze{WP!p>A8N2+^F)uuAky;khhu?TfafRUyCSbe%?>Sk2UG?)0(t>sY&In zCNROL1^$0QRdtZ!>;=ig>vWq>#!4RU);i$T@T;H$g7w3a0jrW5u@AZ8s?)oLx@CA>~1e!S3 zAp?l{pallKhR+io8h`+HxKxfOrh)82 z^9gnoqHXJ6uC>V>E-xH3YKDEmayRsJx75$y2Q}^W`yAu|oETTDq|CdUD=(c+b!(pEoL!@;|?Q6&tQ&d2q&etrxaE=$?tncj2U z=omxRUUPE5!ZHIE#WfZkzmG*h#eN@)dKwDRopHJHOhBR1Rl-c275yAre^+Zo=L_WD zO~hYpNADFIcdRwdhy}l#t}WXI#H>ijjj47VK@~L6-ZKYLu4M-~vvz5={Z8wN2$&_% zL%FfmI{99co921|FLO{dvFcwG0qKy?+rRKAXt+LeljcWmlK+&OXfNEv^WEoKkN0|g zt@Ze=)}yytFC7c<2J<(*b#reY5h2){ad5N8qG&5|)&&zcM%(TY3mkJx^fy0$DesCw8h=AiQC}>EA$AhU#Y$Ume3kk zS{Xo9#IN)x-Xd&gLoQHn`Qj7Ki52HLORt1=i8Jo%i13YH2`j=xmw1Zhx-xGSV}?tl z2cc=~h%mq-WWuApKrk>gL@kQlpzEPq%n~dCV@(cB~c zST{g^vG{`23~+oI4qMJeewuTaA9HTJ=3M@&m)$M%>wL|*-b>DfA6>PaE?VMN3(9%( zXka!P;=szN>lMeSh%>ji;tf*NxEG@)>UG_p7lUd7@Qno((>c(u4HXI!{ zG0j*PQaq>ECyt_H8n$wjwV-F?JbmVf%El3Iiy$H)3Z@q|qt}{PZl%f5Yca@M?<#m+ zQt3`uFOkIQpwuXd5rBa)?qKbf>`~~5h8F@)isiP92Rv|wSoD1`nQZZ{XYRK1%$4GF z0&mMZ;4VMq;kB+Ek^MG;^vo5$uWcSbKW{rd*EZXc!P9wLy45!3r`o2&X?(4nOB)y2 z$Ujf}yQ2GeV&d!-_qXRLZO@ScC4gpZO?K3X+HLU zl8^Q0e4MU)%Y>fuF}&qt|A}vDMsda+>~3JQj9HZ!DEgg2mtX~XM0TixJNq3lDzndl z@tUQ&5w$Zf>9(^1IF4U0S$0E0MT=a=A zBu{(+Uikt6InOyp-D}>;7d)?f;S1`G(ZMT$m*#V=V{Wxh_f+d>lQZ(9K@$2sOm}5m z!PfCGgXS8>_N*aAG~VX}aLJJ~|Jcq6AB;Ry%V-`q-WXrEcxy=G7H=EQ99B{TBun&y z1(+e9&k4gX=Y$M?#fy#0Qne`(49UaW_W&S0nvBx+MeLrCc9!qfy6>h3RKv(FNK=b% z&r~dzW2Q8^6<#96aKlK$?~kk3n129T})Tnlt#G|LhQ*{cg#DbgPlVpnIkSi@S&fwR1{`!iWW)PDd{~^d(6uR4G*CYrV4NKba4mf7&biP^XiC zq86whTpID)3SNJInhR{^vI&{)hHF$F;fxrCL;~Og-gQGHHf2Bvs8hLfTgVX-r)LTa zNY&l(98c1GuTH!e=4G2M6k>hRM(TUo*Uc&Bjgo`ntI7c5s7^QgYhA)(w!7}6Aa{(U zlF;Y#D%0`VI|8BeGNadiJEPZrJ)?L3G@~cK%;+s8I8%e~#spFHv;i`h+tz*axt~W1 zh_AG{!aL}Vo@z`fTM+ii1bbT>vR2kTGJs1{g_2{Vs*L{NQbgrw);Y*>IIGuKk^|tp zM(ex+P?1hGl^a#YP{B;2mAtfN**fPBpt$z|1nn^>zv`~a>5<0VWI-hnf$BN9!6K0% zr5|VX>@y*PJFo>(LtU#b{PjKhR^DX=#?|{GEyUnWnEBMniTJyDOlR%R0-+JQg>SHsjiL5saPz%zNKEqd@IJ=K-@S&^M$Q_`AED+DLDs(PweFR4|uXk=yx%)gk7yR*nT~Y@R2YAy)!oO%E zvDsj$OcDji5$bmEa^xus&KKjcyF<@&qPoB!SXX2B!exp3-iA+Nava$BlH^s4K=HlI z`{v+a?!KHfM+3@h_?Uj>2{G^SuRRfyu}&6plc!O3gWc}z0rV+~zAlfY;oVyYtb0DY zWT~p9rMjb<-66!T(;4@N1(Sj~Wun{QVQ!ipxzD=5baMzpTzl39c8Gq{1-_I}u5G%& z9cN|J?ki1xiWFMnHh?(enf-A;Opy2|Mqmo*oUCPdodFJ~&z69gmFMB*@Vvxg~Pf^{jE>&!A4gSS5DuQb%=j zOh@}cpJhs?)Fb6XrbgRksE4**1YhZcT#bC>AHG#=IjTE0Ji?j&% z?y`DcI3iv0jx9*aDF>ft2_|lEf~rd@KuVLRSpso7oFCDy1uow6EWu?grsVoOOTgl~ zwVckVGQ{re;9E{RLC3sJZ}vm`klCfans~KQ`#xL6vgIfMh9)TC?$NqkQRbW^);tRI{&N-tQXU?wDhwsaDv=@ z*$g{F=jlxsxXEmm&A!s)=g6@}kOge4t3I&fLc_)eGL{mL!Jd;Dp|AKL!kvBg*|zBH;c29vM4>Zc7FVgSO4bIRUvhw*8_XwP%XHlfI)itnYSR5wqEr{r56#Y!->-kEWd zT$8U5NI(|b7uDX2OC+)JvnPb(0T|PD%d7Y+-r^qIJ8%!~pKuT8=lGM3EB=%o%a(`1 z^1<2FY4TvvY7=+q5Nm8VAMJ{H!r!6h`|%nirRi}%ql5jRR7+Gq%d<|ywcAV8 zD8nbJcP&q!(%FVw)#rJ;33fY8ln@RArQ6=b4kUs0?H&us0zd~6MILt)pdFv3QMo?! z@WsBQYP2V>7h^%g=)7rTu9-T+;r*tK39zM{`?0h_@NtT}76fh=urjKPG#A8#_gQSf z0XH!PUwNc?WsOGmIgM6N)ZvnnDO8@9gMHCOC?L@5$zRkC0UZt+i!ww^+WoNjNE=eir5!5lJH4cWeE}J!~)xtosVV zYK7op^9M2MZsBXWahBey{|fi_>%ZdtJi-2z`tQi{gPWGvFj0tx#Y?PQ?)*3kHRJ2* zBj%HuGxb`%B2T^$_Se1;1^%qfs(jXFO?4j#j)3{>$)tU+&Dws^W<|evg2~UGV8XI# zvx;#L6I0ql3BY)6SNG*+isP_xZD_*uh9_s5wz2Jz0(>0T zEa>t$dTdG);xCUiZtxmk zmflyMVB?^*o_=~<#Bv#|ODYgQY6G+7&4SO-E&1#TMqZ&|J{?{>*@e9LRwt?cS|eee<5(MSmh{&*TKs;^)#6pmEj#VVRYPcjPE*6_!Egc0bN?t zYa$7)f;c8>Y3$Kp#I4&wCX1D=nxxk?Co_S1s(N(Q8ckd@KjGl$uQ3P>cH_x%y|bFa zCcu{rU0lz@UA>}?3o_NdZY#!ZE)VPEAb}J{7n!vm-Q#-V%NzGdA>F^J&NSz4FlsFj z1W2~*vgPJ1=wo+W+3=3P-!kWZ;3`Ds$4J4F#uTHiRykgvdp)|dvT_hoK14@Y0QDkd z0ELUr&_S0T*OVq;gCI5z!ir{aRj>k1s6*W$T7IGpai-etd{sk8&6|d1T#Gs$+sm4~ zN0atCbbsg8H(6LWU|pNVkcLhgRl28A-R(F%;)m$CQD6;?`lzBLkC+QeDsD@Pi9BnVR$~@ z*0Oq2J=#RQbx>Pfv_4#<(Bc$|ODXOYDNdjiD8-?;gyK?)Yk(9eTC^1R7I!U9aCa~6 z!GkA|5PrP(-fzBt&P;apoHMg$@4cS2*7K~DF%}~pRYN3M7~To=Kj2UTidhfA4-1}+ zoxct!)1d-a==k_daZ0uClSiexeaN6@zS&P}aoiYh*)x@rp$-WpWf-cvY>@Fh`f@k> zuTWzwaJq<1&3eAcQp)4D*(X9GKo~d5a@d6BJbx~^?jcK0|FS`kQjKv`>X*p1VcC(N zX!36faK+p;A?{`@ac4HxI{?An9|b9F_-+QR>?^J4zSGB&Hs0Wu;KM5%bjLz6`jKgg zW<|9xP^

ZnuCy~Ae!t*W%jdl#RrQW^1rB~B}4Q|(hC+)!f~k%*;?679Fr;h$l_ zg-wyHru>KmSWQr0b^xjGTi95iSnea1XXurwJOth5l4}G~Der^~%h#oUc(y>^7P7R* zN9!G%QN7H6#y$nF@)W#g&r;Pc={2~`PgK^@ALSlub)qghmb0a?$BWCn8q|*Y)sW4d z&lo^jWpxt_siPTb8ByEQN3@mfZo+ zgPE>_AYcrz&U25(fieW>2RIkj3DA7=e@g*5dz{+wIJMw^SeDTLZ-N(C;^D0O6bt-- ziMDY*?q9H(iN4}R*MM-*HAr@p{9TF0jElBDidSqS4A(FHq~y1d_GjU{Zm*cmWEz=# zy$tD1eiITB-PSTaYZ4le=$E+f&jRE6104Uv(KmQTmkyMwuoBL`ze_jVG7GeW3poZc z)mxZ*RG+P!Fj(}9I@!6TB)5MsGkNCL@I*RtA)R42{QNbtqz>kmq%Halc-YJ`U~Beo%%}uwXa)+Z{}OAtw{Ba z-o4-Se8NO7(y+V77RuU?KQZq<+y>~w;F{kM7kr`o8-Yh%>)bAelP~rCSS?ehS^Juz z=NRbV`*s(?;T^w22^$SWh4uQfgN=GBaYJ|5PnZO z!@vih6ivGp(ChZq_lG4GmjZ8D1SQpDL&E$zy@FZZJ3FTzx~M=26c!v;gx=OwSNT;N zkl-UE+w37a4f?oFAwB@nYP8HnWvC8qa3!a8#0(=b75t+hu^xfT-YI$5 z6mL&a1{Z;Dqi8H~c=J5-LlbwsBvxx2(IG&C^W%hoiNMd}L5e@ibQqh65^h_y!$qb|U)_2@v0YU&?SlO{xRJphB80St;6mbxoi1PD!PhhS0go4S%Cb+PkzB>cs4fC`&^x}?}yOl`eoUXm0c^=+8N~wo#stg z+m^F6g)yx|XYVje;P%Vqd1GR|M@N~$n3;BSBb-m#mP>Ni%JPy9sQo%^ra^2ik`eZe zdK@6^mNo}P$<73|J&elbQxds}e|3L#8fRA1O0686&00I$B4zdIjd>*EIOSQP59Ooe zFW5gMqs&EMI{A>Y5vkqFh0!gec&mv}yoD;!0BjV1cl$lgWS zC8inQsvvzW=WWx7>Ee;SC+mN}l~CO==a1ENTc5!k=)oE>JBK|IN5A zXDl~XUmVk{PK*7Yk-SQw+b>Yt2(JkSr|TJ>PotsrCA)(0jVn(jr-5|nDt7R+ZwA(; zaOa>@x9Rw{D;36zy*i?^jqlcZ}*jjTs(H6D{?zKtWIq#K-|5_??=StxEO;Et=~)2`nBr zNO)pgHYK5Ii#QM;JT1AQf&Sn44Mg-*cI5yLlbxR!{9o@pr=Hf&SYRSD%t5JSmktuU#@^lh(7_hw%Xj=t!R}-7Pq@&Xy^(|SAOZS?V{luCpq)SBIm_*b;{7NXKuhHr0! zD4bL*<3oMzY8`M6XQ+ieNaxgWw->5u_bvoB4&fydfsp~=DQLxN|!9p>z_qO;jBAQjDT+wWQ zYCE%LEW3&O%9j4M3(wEprb#*uDV!a{@DD|CYVSm^X6Wviq^3BBG^r*c3zBARB28_n zg4+Ynr%ngoZx332b(gB6Bz4?UN~0lTRa?AXOvQUa%J=QlerT9m){*d@J&rn)y*&pC z<-m|BCd9!L|8+t7jH7soJJ|6Dti9=@3#o>7`s-FcUwW|fdE72NV&DRL`Ja$T6hXGW z#W?b)^HTV~03)OkF(5gb+xqYYXVr%me7WB85W&5Dc^@vBfBH5=y@WbTmHky5N&8tyo%;zov%Of=Q%i&j(BQ>l%8`H_sn^@qR(@si2>x0;nq8@i*3R6`r zXoGCEQf=SUjSP%G#PGq`>sZK$XwjMz+<8=t%V0lU(``5FXGLH^kKRhcZSHjIKUR7F z*PSQm6CXgLtDx`CH|tW^c`E2yJ~)SfD0DNOrSaO_UW)Ulo?|qS%$J?vTiJ!z`euXFdj2??$bKTj- z6U4^y%sqL}hVS`bw-;)XU_j8Xmxt7A7i!?jnfJTd&byqEU!u)N zOKIF=X|5~5H69oT85G9JnzLNpA=k$JJN|yy;bFa-!XqP70AIxOwyIDk%yDUv>4zb# zmrcP_)&(aY$I}AHwMe2!9#roLaPUORxm{>)leN6_pPv&GkEeF$;$I$&_^Sb^<3vZ= zUHL?j^WRi+-f08WlDsy33m5mr$r+{^q~ci7RxmOx!?9^}Rl?^iq1I#G(wC)XUi){+>+7J_UFMNtoitvHxT8Q*VTRE9tx{4I%!NlsZ$l6jVbc zh}es zs@G4tTxfWF#9RW<-)|1{fRxls4TKSE4f^g|Wta>j!iu#0uUB#QW!Iz1V)Ii{o^`X2 z9^qecRK_mxcN-4Xe$=C<*6*4(4GLyPS$`71|1=TSapCWK#`Xb?i<*L=^*e(gd;zyW z($DD1c0BN$S>B0Wg>2UMg%FnZdVPKrH9ty?BT8lz-!o*yoy+Yx{yX~8f}}W4CRYo% z`-Fvg>+(oooeHx~ml(ZzBU|YGyDyDfUk0Zwizh;BoUOA#7b95LOuGJMGOATkG=lI1 zO-~Z+ZCLp`z?-|uns2f>>f=IRgO3N>anCn`_FS)7QR>Ggk{&^WO1N5o;!*(@Oz-&` zF06uf!@fwKmEO<(xsmMgdb-xFjEgE|yT@QGoj9iihe9ByUBtS(XjfN8w$4>E$MetwGe|mc&!X>< zB$xx51bu463sh{#hJngGQg8@Aps`-5(;Q(+_;RW?MM~5pH$?30KJUkLPw^^s{|%fl3tfBRsBT! zo#<1q?*VRGmo(I`CnFI4t<}CM&Atp7Z@<+gcz~+ze&HPluGMV9RD{T{d-51V~i); zs~Nb$*3Z*2I%)r9twabN)i~mC#|PyHWIVWr$7p4%Z$@Y!&t;QWL%jhuBuJ5mp44?H zSS&ugV-IW~9QjZhu(w`6VPh;k9qDVIBS{8m8t6bvfH7Dke);!vmpSh!fN~(3lpY+F zc$a$^6+f=HrlQ{%Q?TO)G7T=gl8FNFvm`v97&8`5E-9L{snJ~s0S&&;pwZ35QRHy> zl;L|ft6`i+f2QkjNeEs^+>;cxcJLx7^!=ws?~>EE^n)YREn1 zEh}2-Dg2vnYM(;i5sc?Fq7B_edaA7wVsYx+EE;LVU#b0&&V^T#CI;*fpSF5vGjac{ zm&UgJqTneEtDySk;@-m4umWY?77(Q(Oat@+#(&|a4w;=-b&li0v%;9st|wLJ{GdL7 z0;Mb2sX8H1n_rySd7StbFvP~N7r(a=~Wuhg{F)$-+RA?`h*BaQfZ1Cv^a}c}Ni*`~S;Hz6tDGaQma)?i9oAt9k z;ymjeE^Fu87od97jo-aQqgx(MT?r3tQAp~C!0&)7{D)O6$$rs|iHCvhDsnQB3WR!x z%TREPh3hQ%k`$xI($wtn;n# zBk1@!nO7U~eIyfP^0#}7MkGVgYEV#Ed`No9z;F+=;&F~S79h%-$~Y$;BKN!>8?Fz_ zxSB$G-IV+SU3XARl4IE!-xtEiOsZ+PZ_8zT|AAn}E`?0(9tIfeIGnR-W4XX~r3PD0 z?lJ?{NQI{9E~+Fs4`1^>CdOE;8n`>bL5Fp^O525+KX3G)!X^a)f83fBNh;iTKXu45 z#+TOOp#jd`tnoySIhxfLl1&0(3Z@?TdXJ`fF!{QV&^Rv&h=ic{w_(FmfO9w*7|^|b zz>Rj@&3Eq1c@)n+j>)6!fm;&~IH-GSbRPN{_|Cm(P88*u;s4Xpv>z2BCGh1^0AHyz zZh0}_)`C1C4Z|;HTNx?)T-0Grw>^;5K%`qEXzy`?{_{ z!@by<)~znhptE<)MY8<*#jMw04Ma{{>f$@_ZhGp2gbG#xSy<1CJWNAG+2`f34%Ksk2fvYh1>E%MEduFfE!1 zZfVwian~}lh4e*Ml84fgFPM>;X!65xzrDpDFV%KyyQ(KFLY7@S9SO-_aQmAB2Kp)6 zp>v{F+4|s8I4Zmy^0q{#`LP3g2#?N9zf;M;OwH#jW>{;vs{F_3Y6=$LNy75#qm?jB zryCa~LZMW1P)O1Y>66eAj)f~T;tCIbM{!%`hM#lwFD26cB(hTXvN>ux{}_I+@6fQp z;ND-?98Vfg^FGBmnDIk*CUn&r;ZfWFIc#!tio~Zw6f4%OTx}kno~y>^RTbRGQ&5-^ zDGq#2pZ1P+IJMtQxZVEU&M!W1uj50CPh^9+j7{o80Rhxgw+DsdO^1{wzrPR(%F5tw zB3c^6WtT4M-uTBCbCJw=-M;s_C8LWdT)AMU&@M^IIH7x^hh?_MRc?kVxuo(#Y3zi7#_Kqg{rUG?hLJi> zh1k@&B0FrZPYVqeer@)gqENTiRT|Ax9iV5zNeO2#i!`j?)Jgdu1Pebb$7S*dmePst z)=XDC`NNyGD_o25Qd94HUR<_mlH+{aAUb|}jj#|bec6H)&K8dAyhNGDy-By@@L)|8 zTndf~K~Y}g9=G3?01$!qU1{mzD4~aj`?9r51g+o1HedmS2F{{6&8~Ei@cSjmvo74z z%ciSP_#B$>asuw02}U>CJzU86pk~nltvAl5zw>keF)F}JaPGRm1Kqv*gb&HpZhNy;Jnr@+gJzLWIzMkld8{q%>%%SOggfc{H)pX)54Qoa7P z+3yvbN2hXuK?1%Tg>z*u1{#UB)s-T_otk-{=jo0~wz+qW1&K?I{r!iP`F*0#r!n`% z5&^3R9#cN(wGmEWmrO;HjHjUj;Xe6MH7nTH)B2dw@5B2e|Gu0dA@{B-sDBGz#p7yz{Ug?XL=8{r&@gnpEXknHV}ZD;Ss zitcT)DY*3Y5|(q~u-Hz}Ul&I&cevN>)DZb)0Ae1dy=9Qi2Iq`-0Jzq_QJXI!I-)Y8 zw^;@PD6Ng%FLx3CS4MuPZ`j8!s1`n*GSsxZ5L12{AT^ZG#>%Axm=Cdav4rHs0 zH$bl>pJV?8zl81xTe!nT1QRq+UnnDBBnJ<6vhOpi6Zp=~GPc4@E2TuoiU0mySsJes zaV-5J{^~a;JxilMQTiY2p6IHo`;>!)drDQXjH1#WLw`9-VIgd41cbV{V93G97zf+{ zPhm)YgUcl_C*EZ-?U?s{06Y%@D6_h7V*nq(=8l$5pUYkrsc8%Oo640wRvb_I^x{+Y zXUWi3y$_137<-Y|e4E-L;!e}fNd9Xb5W@MMacw1<#vC-ObI9&9$2WaRdO@E^Ingi!ei&k5C&O z(P~oL3ndgYm%gXN?!1T$FiDO-zo)>nF1!>Ni@P2*MH4_ca#63UOJ)@h;k|ylG8PdsWfVWAMM`}|1G`kGqEFk zQ{$oGX`KK~a||VE{M5shbTpVc4avFZI+jOtp;fwa+PXaCy%fIw`DQNvgExs^8-KGa zGw}`a8{OL4NKy{dL$~8W+EcP?hcyDbI*O8)DWe1W3?@1n&s|K8O=Qg@NNaD`Z(}na z(xtQR1wlp&ATtqiZj#uh#3NQ`3F4y&gSOtbAFv|GKW|jDro+uCXt?_T+73nPw?oe# z@x{QpI1=UE0shM~GTO7Fx^97QZccrisn|y1Md~LJSUj(_(3cUhJiu$%B$zE&ts){1?ghGUIGdMXfnPVa-#mO#%C|Yc<3@KK zfD_J>re9q@{i%>%ugwsx9cS!zFn3DL12)V@%gls+3&Jnkh-UM)+L4U#$dCJHOfpgg z0U%jVdGHn97`fYa^Uyv?LaYdnw{*j^Kmv3@((Yq{|I`>?6{@prTBIl_Y22rNBzhLB zWjJ$n*op=Vd&`|I<~`Qq29C+ZK|bI3qM$Z850vf1#M_|xE^3VKDs|p0u1H2Al*#| zE`~HQb58dLn*fpJ;CPq6$BeN#}D0~G&@;U1bpYUW5-;`YcK6s*iI^xQ3d4tzUE%9UJ#i~vMb#i)A`J^_>!*0MNY+$uW zL-&j;b46)7UG;LP&R?lnF`&87x-zuWC$2UNEW@G(FL{@r1KikNov#E3^6 zRP-d^?8nVozQ%sPhh+?3jceii>L%aAs2sCG$9F+qr8WDuu~t?#Zvseo%Dyakp;cv? ziD5Axg0s)h-oovi-571u!-m>7iACHBsASqi+vcB&Q_z3jnor5Ir%^2|4oHzg3W2Mv z6c8`LPo~?PIt^kx@OfT2!Cn9q7X4Tt#aWvlBQ7~n|_)P3)I+&MhyX7~Z;Bnf=?KgReCx?}%-aT~IRtQlAaEF)Q) zXZJK~ve5U?GKIG_|RP>BEouad=D_N{5AB7kkb4bFP8V zn8i98%d&W5+q^mX9Jo~`PqK#(02Oq)Hl0ldjE&cnPQH9lL~46nON&$*;*~S5EchyG z#3X1ptsar^&X$t#R#kN{*O$t^TQ-!?Wqm=X{#hk7Bl$4-7^>JFs?9M;%J0+;oGDN<n zT^|k?YSNc zpw)oxng3IELRS`^uRcA`M1;6Se%PSYiO2sGUrpe4{gqU-8@V@Nf4TfZSC|m7UsxAg zJRq^T$}J=CNaXl0P%1P5M_v67day(V^htN*!TcYVZL%MF*B@XArA5Mz8*D4BW`1#PXB;QM-?3p-hb6Sr&K=8qbo>Z3v0H(9f8d*0MFdVC{LL@PXfq@@#8J1bS?1`xUWH>q3&1$PZGFPx5X|UxEse|Eg@}heOOXe zy~g=|Oko_(zQ$F*-}oxsWFOAqZuBKVg8gpT2J21zwQbu*S@wT>e*7`kIC0zPx*qvZ zB8doG#Sj>mzZ+^xk%7o&=N}V3aRCe|GEj!c@Vy{h ztkU(a2x^8df+FBB$q;r|J3yQY@X9~4BM*wYg8Gd=l%)fO`EK8<;zt4G?I~2_#U9VL+>)4 zq2@EuPDsQSef0FwmvMo6iSO?Uw$t=?xZg6Cyo3{tRXN3j)%Q}i9ny=Zds}4QXT|sA zwZ1($HA5{H}0kW z;e#0}wG8L{7xCaeK*QYz!?h$lcZm|tk-CxgS?TSXl1IWyHFnO(E|1nw#^yoB`udvQ z9;_KxZ`%Ik;Rk5)y1?)DzI`jlYy%cn)Mm|D=++C_sX-o9J)| z5!AulYRceSA8Zi>bl`6F)8n}WN4bh_l;BuO=JiKQ!3iBN>X@$uz(9Fyj%IJ;b_go$ z_wzPR#z6VB-vp>41oEA`r@1W>2POBv!Jhtg{T2B;oKvQ(N1x=;F^PuU;iF0>AhCdJ zm;@ZL?zWB|SP^Znekj>ph8wuFdUEI0P`8rjsMXYfHwi*k+C6w?%0f-n}?g~-Yt2eMe z$dfkFJb@-~2K+BeIy7<6L$I7$ZfmATz(B6Hm~ZUz#st&f>FE2^0W5IaC_GJoB;8i= z@MAZ>V^Zkt5#$Vaa)j|7EoeS}hHzS=1#C*+a-zMixlwYDzShqF_*w%9WE8k~y%P`( z{onik3_e$Wi6!~p$YUy(!x3eB4?nridA}`vEslPKfBm9o#M}S>MF7ZrbR))Z{?D!W z2RtW+(jvkyH8vTS9zH!B=mwaLM!g|T{2;EOFYAWB({#&Czv_1m zE3fO1)2|CdzOJrhI5DqZ@%M)7S^k|0_l*xv-|%d#0}OnP$hQ~Lv5a<6!R~qh-J?cktkplY2>W%%8ExE&D;Vaxj3Yt5 zf6UXqks=y)WyQ+9_IN{7z*-<1=bam`ChYsZJrA)+ZQK@pJ`~^mY#?+JgF_JRASGu# zN>lhvDij#EF0)5}fV>aNT^mUODi2%TEPcKc3&gV9wg9iW2TpfLJ-BoPfe{mrzG@_d zaSJwbN&G;I82InBlYt-BA1_e!CK&7C?BTC3<7}k3c-uiDB^!%j<;qIRMQFhj={%l{ z;8m6{63CWW^JH~x$)=Cd!cm++@4oZK5u3&%_gR`B*9D|cjyJS6ch06eRubP|Sz(Fp zY^n>_d!T$@D`5m*(#lEhr3qz)GiGTk$O~Ui+6(mN-Eup__up=4Z zq4o5a{4&s^r~#Iav`;n^>4j_&qf++ApRsiZotmmX?9VO#;lyS{)eT@_ z6VG7Ch2s^EV=6b=$XpdocyI#8Bmn_EZI?4S8Q$oe(Itl|6P{R4Lutlt#IM*_*V-Mj zlvnTbs!6hGZYI!8JuDzv(bPMb!K9~14 zvK8}*Ga17s=VnS%o!i*@Uymp6Y#lk1qB02s$h}UBx+%tArfd`kBQ8gbjHWyR{{+=us z!_MD)#HH82UrtmTKb{PvN!fZ#6z+@KRZT)vKn>QMS$G7ngX0SemP zNNN)V?$-~~E4#LK`WJT+sHalfKWOkTgju`>uW9xJ3&xL&CD5s}C>dXtRf8l>|l1Qs?jG`WX!gLnyRX&rlP?D;b;LC|_hlX_D#AU~! zd9tc^v@XJw=6Oc52<&) z;_V4Ml(t7vs8Cck@J#Pn?Y#+zLDa?V?5tE5+zhw(f=<;ktiG0^M?ozMcf=B%lfpu&C>ygc-TGid%&hcmg{@D>F*7i!VD!5JQuip(-I*M4Xopt)d z>{&)X0NyH#;nD}L5`<| zXR!=A<`4oBz8M_MC;Y%R83ge76m~3xGKEMX2O&Wqf6Iy6M{B~^^JqbtA8=03W2B*v zHWf?&24)4!uDjf5fpga9*1rS9OIz#V1b)0ZLYXJ}>cC)o8Q@Fu(y{55eluPZY7-VD zUD5D!x_PS{RlOe*Sw|6uzdVEYDlPx`KvlBr3F{6u59BdL`3FUQGiiqP%&35fA@(rQ zlRvNu9~fxaEWnw9KjKAGjr>MFSzo|ad&L&Q=jFFpvACzeMAExYfO>fP%@$+IOQ9$t zkDM9My0O=Fz`W5@{b_Mm@fqLEq1v75T0*S2&R+c8?*kl#rq2p9G2#+pf;U0X+>=jJ zN3V^!JOkv7uzqPZy{isr#j}iI6!Egai@SX%WZUBl1N9WBy~4m|dXk)Ze;2qy5cu(I zrUKVn#=b_EF-*f3<0f={?%;00mXKiqAp`N@phCGwY?2!tW)lwWrYh9sNNZxZ7M9KS>x zdHd(MqYpvL1##Jzw|}4}f!CQTVPyKb`B&a#N_mfiQ5w+ehFgn##HjI2i`CW56dWgy zA6*mSePf~}deaW|XRUdi!rykZlb`-mW(3c9Q={cb)W7`)7C`Sldv5YVj2nCJ(mNSi zfs|Vo-!WmdQl;S$!Y7M;{BETRyYpYkH3IXsWp(0o;@C6zy!)E&v=jSpJ8{#u<@I0X z$YP#KP}t*_vi)q35+KMKDBwp`x*b;`P3Ikdd}HR#KoFB-|1LdC1atZ>qL@)yRw_g$cz2yyxQ~Q{45cmF<~|D#zEYObR*r6 zz)N`UNekoBQ5`qPFxPLt$$GeGFSR_1q;;=wQo_cAGpF7V9}3UD)aDfoNVgFH^2PA5 zs|ie4NZ|V@R$4sieJewd)61%Q9|c;x0zw(y65h|aSMADV^-;4fEkcU#+iZVUnknA8 zecXqg8h~sz}RO-8#G_)(pLr|@+ zo;~S$X^gTJS$`1Q~4IH1U&Ej1wmDjEf4e}Qc_eYsTyCS z7W8w-<-&n$W%iSE6&Evd_lzV8k9QyHSX8H%+R`Z(2jkezW?Oh>huvf{^;l6OD2sSB?zf&pv|~?W+aa|C*D{)87g}J?M=9-z_T$W=%!eK z_)@-MVyxG#E^qVH(>cye%2rrQN>Y&2cZM>|tj+KACDAMRZ4}V;GK`g)hI>?rJI9*> z1stYjWuIl5GBB3m93;z6Lk9nwtCOq5+)Wo}Qnr^ipEEAr@#C{Vo{NwZd)|_BKC7 z7jr|vX;`nq{JqE5nr63klv!cQx{4)#aMQBBq|ES}69(3E^V&R?3JL~eHm3U!EC$UCkxi}pntauVG|Tih7)kpb8C_S|LFZIU}< zZ8R!B=$`H$6f`^RWhpt&xmj}F7x?1T>QVPU^62!_xicP)9v@2RgXTuByqsout2=C{ zBuwu9zle`#Xh2W2`|-q>*n{()*?e0Xz#ZldUF&WkS}khUzw16KT|>7l=(gKGc&u^b z4^6BfPnz}P&+_i1_ySz_K7-{U&AeHUZ`NmQ%>j+CKVFzz**)g|G>_4u^EF6iWB07{ ztns}XXuQ(|z2c5Om4<3tg=eFA_)38L6^Hj#M-{P-s2N}W@NED*6B00C7?qTVetdUc zV=W|aVFj(zzIO!Hag1BEwUxKH{vEh^9-XEX^S~#1GN$?2^4|+VA-T7;lFiucb$t0g z_qQH=YTjaufF-;S>-CGZ-+$|oGL)|ivOxhhDm}2e0*y7tzgI?!Y*vOpSPtFyu(%jQ7NCM$#q(=1C=7ziTkR+RBls88Tf`brwf$@J<$>Ix52I ztN+W6stSg_K385&`c<{T5%ubY2+_m*;pSd-AbB8Z+TM)=xwfff^*iUE&y6)AHyyW? zL7tk&gI$uPA>QN)c(?b0C(*rhJL$k&EspOHu4{v-O(g3*Zmqhif5EF4RsW{VUCxN4R4pc3jKe&WtFR=O_(PCmVA$nJY?SN@i6jjW z&S?VY9!{%<*HW=#ar`MDdqZ&e$lAoONV+Es*t^L&5K6gWyfm}i<>NRERyy6)QgJjl zvc0@`P0^7WV0S{@l)I-=h#?S3+{2uJc{_i^@eknxG$mshYgmV_9sg!~DVhs!YPNp+ zrCFaa)aTFFTM0M5kk(VE)ne0mZpC}4778~PCEL!YuctdM=Evwx#}>?F4#d0LPa5)_ zJ8tIeKH{HA0zm=&=-rCe&yeeeDuVdG1ouu=eVEESJ;tIS-=o4xU?i`0w!K^+!ELiZ zZ$rMMM)FR&?!iyzxqsNha%y$7oI_?F&1~8HQ(r0y;=fYej4Y+i8I`(^i?yH+9joqm zO)vG3WmN&Yj~|^}0K>gXI+xR0o}3!!7z3<|G~U2>#Ro*Ml9$1SjVSg#G|b|ZJNA*& zy7Ra=><^L64|S=?((n~@7=zn#IM|zTv3KiFto!&o(8lPQ^M$kn@#(q5GFg7#&5Fbo z_S<(q_SHr@#Zzsj*kckC@$-4L92o%4r!VyXIOi}zwuMg_@=o`dPtjX^u^jv|<@BBu z?dS_32CzT0zv9K|we)G?-QB3)!{|k>?iQl)lD;T^XMeZZ86r)qQl%jtxfd@k zFMi_1HC~teyFMRv`_L}`E&HKTT@eijeY#~7TT1-1j@|^64J1^J8#Nq)E3}N}4vDYt zbm^u&e@`dgIb@HR*=EcjdXVK zGX)W9$dSm+s6^=#9F40p5U7s^U5*qB&wN^ylk)E-%B3AY}c&MP}xdKTF9}!l(PC3(?QHozS}4BBlN|5qC(UBa?~4|G}on&&=Q&) z<;3MGnqb7;w%g4X-ncUx6DQe^Wisi7#@k*a(E{`1%=9}UA~6SllnKefDpo(rP?M4x zCRk?^f+ouRx_R;mf!UpOsn(2rJcJ*@cfw(x^Lu>bj2j^OL3VYU@Om=u4 ztt_*@oRzyu_Ty{jU-*bougdg>Bf=Z)AXSHVHsY_U9vPC&h+UnxvA^}z+X(Tco|LP! zQiYb7WS4?{=U>F0#0yWl*6;L|Schz;r6_K&;=}w*6@6GWZsp_5%a@RT* zs#Fo5QxA_{=|*g%W5|X%^tjQy(-`uKZs9xdSYSr7kd>Gv)qRL|c`>HKcvCdf^EC1m zzNb#F-cyx?;p=2>_G#|WnepHd=-;CSs|EfTxGXe)OWDQmOUd3r-*!tAk2iCRtP%m^ zvrxIBC%3VyTv4WfKbvxp`!~_4f6@H;3yL(ne)T>=zn$f}Yq?V?XgEb_C>nHqEOdeM zT0lcCe;+oxD#`9RFKr~EEP1&zZISB!D>RLY>j`T%6SQ|He;d3lqVn$-bv=!)#oBo( zOi!Bsw$w^YwI=Uq;r@4u2KFa%O${2V((9n7$;Ff7wjZ+Xc38H3!wB&+Ba$MQDEKBB z_;TE!9$xC*Nnf&sJk~7Oe0@^16R3RScdzIBYy!?>0bLyNqUoFO=a`t+#Xmh&e-jAB z446aoJ1x5TyF1rB0VP^p`GveY<=ck`q%FC5gIe*)Gm{SG8SQ?xo57` zn^KzP9h+Ov@&HZRfU)bg)gS^r>#v;V_&oiAwQ_&taBOFK1`294B!EM+GGV`X57|(~ zc}uvpJX8AFiN!x)>ZfE!Hu)^wBhgv5TX3-o>Az9 z$u;-6xCS%i^_4;!(UYnjlNWCGPi&ozE#WrJin0C-{#HbHeGbt~wZt2xZ`Ne8$4FVc zeci0}=^L*wP2LlHrf^Vx8Di)A!NB?>PYlief{gSkt^KzMGqYbw*e&gH3MbWbZ%7XFn88QdM`J$|-;uLuV0!Hj`${_oYbv@`y+;RGco}?v?-OJM zhe>AGh0UjXZLccR$nfpyWa+KM04I^UHP4ApSn;d}ty#-Cj!)M@+Rk}@4VT9>LM65Q z0>yEZzH)yc8Tj+DHnwb?-%Pj{^Rr^2z@Lca)v8#GQ|9W{#CIH1kH)l`Y!05SdzUtQ-`A-8IQ)rQc5FPzuh)@8mX&V z)0vHq(epx!;U|9I_octgw|>fd@#FkS<40?X?XxX%B=b30vEmWg&w}TT=gESWab@1t zD*IkRl1$M>@Rxw+%& z9VaZn{!(R+?xsX;oP6QH>V3H_UHgHb3^)G&arKVjkp*4b=w#xFZENCWV%xTDn;qNE zBpq{N+qP}nwoab+d*1V1=ltj&)m7bl*SgkT_p1A@y^8W?Iy+CE8-0v8mAsjrXN~WN zt$h|Pa&XhN`|MhnCV41`a&!cQhJe$-)J}8I#sge6ie}6sjy@oDrXptO47ARWN{`F3 z%bW`0?v(yaHZ=Iq&vebt(tfWh{|e5hD=6B3EyOLiULA|VWr(Z3rjN(mc4u6sADP?i z0=M?ng=1$vIGtcx6kD>F5gEWe;KBi5EI2%{;z9aYX8 zzbfpGwo}pI^AlI4ou7ab0{Do?)7xK96l&X%kxmoP?7F}CqfFi6N7uvR1b~-tK=$e$ zboV0^&oLLk1cTJ8-x^R=mOC{stE2X-+@L_E1i-_eGsfc^I(6S``a5y8dyNU1a0 z^s9RU^&u}w7Eq^bH`wA%TVxyHFJ{van1pLZ@w&9?AD^<5+P z#J$pb`~LK-Me=GY8Nj2q<6ap{!MiAIAy&xr+x(Y=2HRCJBVAC-&*O3_u?BXJ(S8+1 zYHUo>>P$%krFiF*A?T?Ja}pbyPISz*n{a40(5SfbN6$twTtt?B{3qNxSLg!Qs>o53SL^r?K}q~ z-g=msE80pF$oEl9!U#t}2M)v(_WYkfOYhX>m{_??cya}m_3|i>#tz;DVkG?7MR!t>crGg6&2p$(+7Z)1RWAA$!UG_Y9&7y|) z#*}mv!i!m(4G*Rb4$6-`&d}rg+`@HuDiz?gP;?1>`+aWxRdLn}XK%Y6n+^T9K42ZU zyCEr|(Pv(i3a)F46Czr{W(Z3VamhU{!IiVdt{Ab~#A2KtXegzEZ7ZA9i-u4CIr}^V zKNSz0;El!ZxY`FJMw=h%s)Zjj;I6&%DBvR*=ADF+H%rK)&$|LwY4#WN@r>=O0{HeP z(p=9PG-?W3TMcba^ngVrgX0Vg!zsZhIO17RoC8bhEVuj2Txp{PsU&rtNuwI<<4t)2 zEK{fWW)L%?@$Q_5U(B#VQ@zlN_5jiPRrVPYeI+wQ7t zF*lyoOkw0)3t-(4-OY}XX$C_aBI#&+oz?KyI|?>Uu7`|c{IFzgnA|UrvqXR*ebR5K za&yCJpLVW3cog>NWx6@P5{`w34Ql_LTq5?Aw2k|}8-M0^X-qFEF#|O|)PFpmeZm(j zvP~#PLoXcO{3atjK;ufSmrG!std7K)w-Tx`WiQS@2$tuwDMU-E@tAp4Xw7*1nNZ?X z2&O@?Mgk@M8=^>Ex;bKH^0Uxq0q&s8_WHL}d*x-6`G+H^eNg{^W{HXV(;hU3*k1ha zAUMH;@UF$l8^r9l?ym$4TQ#O*3ucI6O!@(mYaIiL?kk3b^0#;zLu-zN0r}ve#H^TK z`52YF!zqAc8=A_0ccl-W*Q01K*}GFpAPAfq)H^<{w`tPf)krNHjaw)ohJl}6%td>P zlSoKfXAD{Q$3(f}EkVB);2R%x32;q9tg6#o_E+}uiW3d(u?EGgKMyuN+t;fsO)p+` zaGuw_h2i&cOVlEEK8d$?&eN*q0TRE%*C!o)QE8vnkU`y|_=h4P=aAT3;4?vYGxQC~@9C?hOui!^D_ZdE zi@5?H$ZDBSxP$~8+wW8hQ<^H8NM8GXx5=R6YVi7`mU8;Q+0gqzHAu4UILii@<6l(}%^)^ffZAqg0PXBtMjNnAR~9`|Bb4OdbahD(KjC8L`p|ZEX$$dGjm; zU8b7Msq)B<@T_p+eA^oBb`Cr>**F+|69G&4@Y%7(w0r>v8f}3n#CDM(xWWI*f@UA{ zD*6}T)vNN;{s^|-;}GTfu~dO95S)d!Qeaeb5kY#`9Bv-=l-f6vsImBO8qe53)m(Ef zOyqN(g6^sifZ1Tw%)RqFiezs>_4=!rb5*B(z?Z${P+09|CiO#vFYSIk0M-NCyp+W( z^gTaZU^}KyFb;mhl|H-9>`S*eTcuh9GvU*tw`^gOZJC_?>5|Y|&TJ~5(v|rwdNKP% z>~vX(a5S8}3q#gqV{Xex^*PaC3=r(&Na85$1nyk2t5}lXePndVvxc;Kt?-hO&9N@c zdx8ERcqF@k3N-gA=wC69JjI{cd%yzULiFf6LStnP2%^e*__E|NLnXckxeY(==nZRpmAZa~@l%2R#S1rUW2LLVgT{oiE(q0r-9&3hJjndvi zx0z9k$dt_qH@mvcTM0~Y>jsj%f0vVOX9V+bu(1oIpvBS%h@!QKy0XUA?k^B4!n$@0 z4I6G(u zI{Mh75%XQ6aFClE|2+|;V^#;q%0!yg2S^}zmL%|c@>s&wPW(OyOa|rxPXwv?039HU zmeq+cAB#X;?>%T1>74M?*|&;w_Da@ic67$-R-CCUqpPyeKsKLwm%ULqK+FR!qi^k*-K&z9Pm@2nck)~jVr!rOUW)o0;9NkPy7i%I2aW!ySOhH)G7 zMJt}3j<8K^QgM)gyP}&6bO+Y8PD(LgX+D6*MhF%LF2>%oX1@^SEF;Z~Z^F8#@o6rT zNUsbUoVs}?)QrNhjrUsweso{+;2bJ^M4^io=eua0Z~Cyy%bxOaJiFXbS(UnQ`BIOK zc5rcaEnVnPtJQ2J=KNS6O?vw=){@RzyY_;zN+tJlNrVLiCXxS z#7LB;AWMjdS?(czpjTq*iQ;YT$m}v(uWfbLL?=L!)2Fk}hrx((9q0Wtby4;1uI1DE z+6mqw<<4%aD!6t*2fDkX$FB5ay)4?&7NbrP!&rTcsN{A{#FuczQ|ewTI#{R`3vl-A z_YXhLAr^u|+BJZu7R~)0 zKiH55Ap4}oQ^ca-P`{rT{Lg;QYw`1aMNa3*N3z1?M=s1}=XT#BFgLns4IGF&#m>ow zN@D;5DIMBb!o=>+xsF6${p7iCLMfm?PeAq2W|rmRd8P`-RRpg}Z<@_V(k6CkDW^mG z!v>)t&**vScJHO?X}75>8+29hXlqLas&@P1voc_dPosO8qv3sjepNOzBHiwKaGRyK_q1H zUpQ9xT~;c1e1U!=J+|eWJKW{0BR}naGCKUK0t8Qg-IxeG_ru}RolWAe((JEh#Dv|3 z#`&;Jz9|)O=R7uv5ujx@-0sw5(;g$?ptYF`1`kh6AjRop^%vgTUDI{_X&yy)(bFdja+vd#-b^Hiu$gDodKLoF zx;VdWmD!#MSp3hf%;JvVLY0Qx$KHpFN)Zfw*_l9prPg~hx;JYB0PBiGBjsO1)ah!i z(P9y&%52&hdz*`6;;s5sB7haog>h_)Zi_t@KI|;$1zHE5)O^8Z*L>AnF(8v+kYar* zt?k!uE)0Djd(r3_?Jt4LSAjfPfLu@MV$_~`Z{gw*lj}zbIqHtx<#rZJ&#Nj*X$QIR zu9!?%v6;+oUaMZ7!U!%__93GQGkdhg^Br8VK@hc-vz~jRCO~~9!)jSrn;dQs;G@?~ zQ+;Da(<+9>EB3T>;(6;-qW~PZy{_}DwJL$dgUnxLlV@)9Xhh27d zo$D$Blq*GG-{XkH#El@xK^WS|QHSYm`%(tqCCfv{1 zI{Ik}+=+n_H3)uaWJ^?^ArIKu;PR$(ZOL3QmMWtbg0JM z5pVS}d*Kd;u*;Tt9p0B6I4u*)t1s6}&rcpVa3j+uE8O0z30pjBJEF`iO7*JAKQ$`M2!S!2^J=sPkE)AD?n<@?BiQYvnH{G-g(zt znCZJY;|S=)i%LZO1aD%2YSceV@p3>?RcWX1uekn@x3c2Z{=9SU4I$!vvm;jwg@pAj z&}ekNce>AnBjzuqEf^9DY5{(?YlqzZ(mT-$ZZ@w*LU?fBu@-WYCw${;SAr|arH2g4 zUl`qlg!KuWZe{tcxd|gcV5A^Uz32?@Z!GemrabBiBdk8?q^eljV=n6!)I#Smnxwxi zi+PvcdgA^%-q;B8YZw+7^lfx2VV^niEM6n)jWz#rXD=UgyUwMUgaHRC^LH2Uct4Tx z5q!A8&2(jDm4*Fy;ImhZpf5gl#U?$;bE&fKQz8KC8+M%-Gkw+B4+4Kd-!gz%vZl7t7Rx1K)2S)D=N+HqO*kIkWT2De( zGp~~$aeM+Faa236pMtyihPKMuarWUn*oO5++g^INz7Vcc+HW(7?XJH+_nDux&vnj& zl!7GAQQWCDNFC5*u*j+wril!1iajb#RM*z5%iHVt6=x`9D7*o zz2|zBPRR>S5MJj%d32vn^A{&KqDy5>8QQ!^8M3eA%(>!k?nkYTU?N#Y<31ql6S78T-8$^65k-&?Ql9(&w^)4d)s@c0_dtC>&y%UlVpT-ulTB_hXB}=}emT|v@ka54^ z-8!*j-Vy8iP-EUvR08Wq>r}aXl|k{zo$;I37TyL=K=RZvbJo)f8bCQ1va8=AR#ciO z-9XDXKzLAj%y=)AUSm4+48Zge__>&8TP;Ky&pxtaZEms;PgtoP9?OG5VQRLz^(ZYr z)t;`f*36N^%k#ANJmEBjj|-kmgVWyBE0fS!x0gCpB;+zCk;*Dw=c@cX-}_8M1l@#J zd43eLM=BAFn8L8y@)~Qr*|XdXyZ0+f&^2O|Qny%6g&t2D(ymwwQQI)|NMi2@Z>Xf$ zF+Qe60pg$B8USK(=zPrp2d~7x3P*>A6khu_ z=%V!Hhxgc1dcA znBlO#qP0brjh~gk&mRN|=Ld#lxz(ZZmkqeTspKLG2pcSou`+Eq{+UJ|hEaQ4SLq5D zH|i64qw6~Q_bM>980`E=?qt@dK*Q1hI%zqY?O9v~pyEq=>JOm7mkAG)mOyDLd0Ps>8Z7G#6M&pUAJ zc{dO`(3e>@$K{@vL5`5i=E^eXyaz%c2uT;A?7F(y3j2;r$hts>xA|)6FV#%YFpl{>{6c{OEk@goZt)=VN6h34V3FSd0%SA^DH z)JhNUyEa$7W7_NTL1n7&9JSsgA&@uQu+6gyTUP_KP7gKYb@ve%Lh;Ha@Lgs^9~s|U z;u?&K#WO0Y>&h_T6<14_8ewoYQ5#0R67u!kJ}F==CeSjTXLjg=Hl$-R;|9cK%vp z7RB8RbK7DDOQo&bo}4U-l0{32Yf%kb$YY*GWuE!dzoLpXuHmi%RB<#^hd!G%qFtR? zO_A_7QH~fyo3L}=CTH3ZC%A!+yNRmL=Wp@aLu*sr)TtiL?#6A<*JA99L5(dFkO!PndZ8H zzWR?1Y<&UF-yP@_y^FL9z@S?>Sdo(eXN{;3XcNvA0YJk0pL?_@gywjF?uB?&;2M3K zY49->nV%!xh^#Jbfj<@nlb?XavJu(bkqiCQUZeaG*MeaUn z)eS*P8u%phJnh;<*`H{;Nj?L4CJdoeg}<-hfe|>EKPfYSuc8;xgpXygP=9tN%?Y`4 z&RSEQzh5(5)0cl`@Xrq@fj){f6l?DuyhRTD;=u6u#J`3K)Wdv-XU$o{bl&n8*#B=+ z*D2v0FC*wH)CrkHyHf9C`{`9+09}*Zh)nom zLNT({Bk{b40nx?qjAz|`NczIX9?tA*@O_P~oJ54)mhcejGFV|DCx}37-%SKspK|TnN#|cIrZtH;FX3p&}HG(RY&B&5yAhFNe5hxLhV2rmGm9)2)RQ_WcM9uB8n(ZopZ;?R9~dAuQO* z@EqK8rN2i;5x@0^VrKEb?zXIJbp74U^*P7L{%wz|?(Kno&S!Ae?IlbvNQ#=zUlbr; zVFJm2AT2f-)g!CzcZQTp4*K~W(kIuwVpbwIO^u}oz?JuelxZ)B_ z{|?9`46taKG!sR6wi0aoB)xT^a(HyluiDK69UW2SfsK}(F(<68puqQjV7~veHYg+{ zCGGJ{0HER?m&%O6S8s}v69ACkbJ(+g%z`-s|41*K)XGu(!pu16?@Gbk34wHhCBz*- zQ-o{>#mfk|bg9b z>RymSDH6lv<`}D(LRgmwJ`QtiyAgY{aEk)+P2ML-Bfm~PCGq%9>CM>ORJmxyKc~28 z$>(QqoVL(!pR$JH05MdFIC7N;wo(5qS+wzL(x9Eq_Wh1TUT#1Bt<^t$2mVT)0X#3V z4>1+RX&2tZ%LlsirWH#6m9LA>A&Su~q+y>GK!zIb9}$FP30Zp#k~H>VhJ*;o913A- zoWiQ^-ASZ*HMCu(IPEQo#niBo1~<2;mVp9PTA(_zn7^R8xmlKH_Su5`&;X(*8?RckY&h+t?5JVOVXOPFlLghan%@5XcUqnL zd>1mCdM=O|NMUdb>Zq6G#OYY|Vuz&Jzt$Qcnb#DOKf9~FlT=3~48=E^x%-{Q08)23 z#bc}!dsr7bIejhAUBcue-a0uN*oIItV&1~}%RmYnYS0dyT` z*Y!LsL9DT}7+3=?@%8>CbBjimy$hoEagVt~{gMu+vfdKrPHye{StTQ?HNa;H@Hz`&kQSAqeSrZZd2LGz{Y&Zp?XMqx0t*ajgGsmuJo z9Uw=nIX7v%s_Qf8=!uG3L+F?(Lt(9cMVLu*z&>@ir_`Inz)~L&vX*PU8?9CN~S83Z6aZTh(JMyN^g9zR+Sie`CmhBdNe1HI5CkJTW3eX&qy_x! z<0eefBeBDv?s*kjI3nM6R1QgDQyvY^{S6**aYjiKeJPqcCo6D5;4ap_HPqI;sBOVRWPMR z7oU7X2yjFdJnMg2&sdg|fNLBavSBNh!{pNo$Lfnd+b@jcSbRJzLZDt_`!!01rsTp}(qMq(B8P z(%z4Ba5h=>V5O#}A-=&uDcOKgyB_`9;GS=gg2bs}hi2;XPvmA<`~N=ZpLZPLNf--4 zax|vnML6(BPF)aec$0%ndfOK-$oK<)azU2KJM>HB(%t;34~3@WFwZw)a?tD$x!BJ{ zwv;n>phJrvUB;#)#m|C~ZUENn?JzgX*5*z^r{=sJF01z^6?OcOKAvZ=$U~^ySgJ|O z`h)JrfNYf`A#TN~=2+1oRKn%I*>y2~N}zjA&C{n5dIwYG`NU-2wn!xiJYA#lFmj5k z#+YXQE=sEM?e%zjmuj6l!oDKnER~AFHOOPU@`zs;z^hvzJ1rG2q z-wC!!zpdjN)RU57`~^J6!<_#w;P-ik3w(R6^yc5UM;utmug#1CS|4Dd_RE+DNo2vc z%cfa@anCRgg2MQ+Fxz`lImP%Di?c&{zkHUGr&E6B9R)nl$gpdelI&GbJnN2V{KxFExtuA4CKzg`VuO6t*N%0z zePLLH5XFLs{iGcq$otR~Fsa^!W+P4aD`6w5>A_D|79(iu_ud5NF$D<&bF&1OhcT6# zdb|J!KfTe!zbZrdVDM?KJMP#vyDcSjV)ScStenSklKUL<>*621iqycUj&U`#Qr#nA7^7q6dIUa&Mqx)Wf^Zjg?NOxJ4$-0v`Eyi#~&!M1%M?tufIqlloxZgNg0!zeTb zX8vSDU5ldT>x>KqPh+pyyFQiS`AZ|w>H7%^fJnz+?p`w10N~KdCWmY``7oQ zJ)3nx%qFan|Hk&lfv*DF*yW!m{^^XkaZCTR_hac#6oc!L@S~X%%l)CFJ*f@!y3XL( zcd`xiJJ*ihs;Ql=Q#A6=>>Rb>fAy5EP*hLP)%?I8#?SgZM8yw5?wc8hzuz2V;(8S= z=zbh=*e9^1MUmk{a`sn+cd!qX5;cdbmh)cK8Fyb>ouM0>USoT+6rjQNOLf(cd1s0F zLgnVCpw^4iZQasq1i39;7l&rQqzr7V-(rI@MK7X*q}i|;|EXQwk7;sZ?p3#?yXl*0 z0j-~3k#N2)qr+yzFmH5C7H!+9U7a4lR6uJGy>Md5nFBIkJC9nKJOrIb1gC zz8iP`=_Ziy+n)hCH(3Qv)mOkqIiwrvL`F!@LaGQ|?tU`wbl`+V^|0>*i+@57Lq_iF z9QV)w`+b~G&%rH#3??p|AFv67&vyx)i2ug{qB8a+0Hblpq&pghTBM(DW%F0UZwF2X zcs+tF-3BvialUTRwEVQVhk<-YLRDpbKe8;rLocp-3%Ah6-TEg>6VaJ}(*@BY zaGG>~x%|L*$zI~ODi5yT+DTrQJj9wvCxR!8Ql_H7KY%s%SH8(^%sAY5;zQ&v^NtiG zZm*4*+z8!n1zf06u08;-!|Wr;V48&4?}u>j?xwKI+at1T<6Y|W(RT+|x1-Ao-i=8t zcObN?jzSMicn>R zY=Le}Hxt)?9hz3iRG&^}GR?J_VAKBO^gaVurIOz?991i$#HIy*4x{96GYN7tn2MC;vfJyXwskl_}?_i3(O0WApQ&TkmUa$*3w

XmT({9pROF=6jJ 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%0A_a%ye#;IWQ2FF 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 z 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

ToL*O(RilE3VSs?Yz8r?IGElWbu{rhrOQzj*jW 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

no~DMA_ZoR4lRY-esLZyf?V@J00ffaSlf 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⪼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

)KO^~TfA6Xaevj%cJg8##~VBeWfm<0X@ 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�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 bvoWHJU$5~$>fRSe$oKc(;LZ~vQT!MHMwrT1 literal 0 HcmV?d00001 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..5fbe58d --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,22 @@ +"""Test-Isolation: Tests dürfen NIE echte Keys/Dienste aus der lokalen .env oder der Shell erreichen.""" +import os +import tempfile + +os.environ["ONYSCRIBE_SKIP_DOTENV"] = "1" # .env nicht einlesen +for var in ("CORTECS_API_KEY", "ONYVA_LOGIN_API_KEY", "MITTWALD_API_TOKEN", "MITTWALD_API_BASE", "DEPLOY_LIVE", "OIDC_SYNC_LIVE", + "AUTH_ENABLED", "OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET", "OIDC_REDIRECT_URI", "OIDC_LOGOUT_REDIRECT_URI", "OIDC_ISSUER", + "ADMIN_ALLOWED_EMAILS", "DEPLOY_ALLOWED_TENANTS", "CORE_RELEASE_TOKEN", "ADMIN_REQUIRED_ROLE", "SECRET_KEY", "APP_COOKIE_SECURE"): + os.environ.pop(var, None) +os.environ["DATABASE_URL"] = f"sqlite:///{tempfile.mkdtemp()}/test.db" + +import pytest # noqa: E402 + + +@pytest.fixture(scope="module", autouse=True) +def fresh_db(): + """Jedes Testmodul startet mit leerer Datenbank (die Module teilen sich sonst Zustand über die Temp-DB).""" + from app.db import Base, engine, init_db + from app import models # noqa: F401 + Base.metadata.drop_all(engine) + init_db() + yield diff --git a/tests/fakelogin.py b/tests/fakelogin.py new file mode 100644 index 0000000..775e5f1 --- /dev/null +++ b/tests/fakelogin.py @@ -0,0 +1,59 @@ +"""In-Memory-Nachbau von login.onyva.dev /api/v1 (Verhalten laut LoginSeite/docs/developer-api.md) für Tests und lokale Entwicklung.""" + + +class FakeLogin: + """In-Memory-Nachbau von login.onyva.dev /api/v1 (Verhalten laut LoginSeite/docs/developer-api.md).""" + + def __init__(self, users=("anna@x.de", "bob@x.de")): + self.apps, self.members, self.users, self.calls, self.n, self.rate_limit_once = {}, {}, set(users), [], 0, False + + def __call__(self, method, url, headers, body): + path = url.split("/api/v1")[1] + self.calls.append((method, path, body)) + if headers.get("Authorization") != "Bearer onyva_testkey": + return 401, {"detail": "invalid"}, {} + if self.rate_limit_once: + self.rate_limit_once = False + return 429, {"detail": "slow down"}, {"Retry-After": "2"} + parts = path.strip("/").split("/") + if parts == ["apps"]: + if method == "GET": + return 200, {"apps": list(self.apps.values())}, {} + self.n += 1 + cid = f"app_{self.n:04d}" + app = {"client_id": cid, "name": body["name"], "slug": body["name"].lower(), "redirect_uris": body["redirect_uris"], + "auth_mode": body.get("auth_mode", "required"), "totp_mode": body.get("totp_mode", "disabled"), + "allow_registration": body.get("allow_registration", False), "backchannel_logout_uri": body.get("backchannel_logout_uri")} + self.apps[cid], self.members[cid] = app, {} + return 201, {**app, "client_secret": f"secret-{self.n}"}, {} + cid = parts[1] + if cid not in self.apps: + return 404, {"detail": "not found"}, {} + if len(parts) == 2: + if method == "GET": + return 200, self.apps[cid], {} + if method == "PATCH": + self.apps[cid].update(body) + return 200, self.apps[cid], {} + if method == "DELETE": + del self.apps[cid] + return 204, None, {} + if parts[2] == "rotate-secret": + self.n += 1 + return 200, {"client_id": cid, "client_secret": f"rotated-{self.n}"}, {} + if parts[2] == "memberships": + if method == "GET": + return 200, {"memberships": [{"email": e, "display_name": e, "role": r} for e, r in self.members[cid].items()]}, {} + if method == "PUT": + if body["user_email"] not in self.users: + return 404, {"detail": "user"}, {} + self.members[cid][body["user_email"]] = body.get("role", "viewer") + return 200, body, {} + if method == "DELETE": + self.members[cid].pop(parts[3], None) + return 204, None, {} + return 404, {}, {} + + @property + def writes(self): + return [c for c in self.calls if c[0] != "GET"] diff --git a/tests/test_core_contract.py b/tests/test_core_contract.py new file mode 100644 index 0000000..a2f2bc6 --- /dev/null +++ b/tests/test_core_contract.py @@ -0,0 +1,443 @@ +"""Zusammenspiel Admin ↔ Core: Vertrag/Schema, schema-getriebene Env, Release-Eingang, Kompatibilitätsprüfung, Rollout, Rollback, Zustand.""" +import json +import os +import re +import time +from pathlib import Path + +import pytest +from fastapi.testclient import TestClient + +from app.db import session +from app.main import app +from app.models import CoreRelease, Tenant +from app.services import contract, deploy, releases, status as status_svc +from app.services.importer import import_all +from app.services.mittwald import DeployError +from app.settings import LEGACY_PLATFORM, ROOT + + +@pytest.fixture(scope="module") +def client(): + with TestClient(app) as c: + with session() as db: + import_all(db, Path(LEGACY_PLATFORM)) + yield c + + +# ── Vertrag / Schema ──────────────────────────────────────────────────────── + +def test_contract_is_loaded_and_supported(): + assert contract.available() and contract.supported() and contract.contract_version() == 1 + assert len(contract.schema()["fields"]) >= 30 and contract.build_info()["sha"] not in ("", "unbekannt") + + +def test_all_imported_tenants_conform_to_schema(client): + for tid in ("demo", "onyva", "revier", "rotary", "rotary-wil", "sportklinik", "sprinz"): + cfg = client.get(f"/api/tenants/{tid}/state").json()["config"] + assert contract.check_tenant_json(cfg) == [], tid + + +def test_admin_knows_every_color_the_core_declares(): + from app.services.defaults import COLOR_LABELS, DEFAULT_COLORS + core_colors = {p.split(".", 1)[1] for p in contract.field_paths() if p.startswith("colors.")} + assert core_colors == set(COLOR_LABELS) == set(DEFAULT_COLORS), "Farben im Core-Schema weichen von den Admin-Defaults ab" + + +def test_bespoke_form_paths_exist_in_schema(): + js = (ROOT / "app" / "static" / "tenant.js").read_text() + bespoke = re.search(r"BESPOKE_PATHS = \[(.*?)\]", js, re.S).group(1) + for p in re.findall(r"'([a-z_.]+)'", bespoke): + assert p in contract.field_paths(), f"{p} wird von einer festen Admin-Maske genutzt, fehlt aber im Core-Schema" + + +def test_schema_warnings_flow_into_validate(client): + cfg = client.get("/api/tenants/demo/state").json()["config"] + client.put("/api/tenants/demo/config", json={**cfg, "flags": {"ui_kontakt_feld": False}}) # Tippfehler + v = client.post("/api/tenants/demo/validate").json() + client.post("/api/tenants/demo/draft/discard") + assert any("flags.ui_kontakt_feld" in w for w in v["warnings"]) + + +def test_contract_endpoint_and_settings_get(client): + c = client.get("/api/contract").json() + assert c["available"] and c["supported"] and c["schema"]["env"] + assert client.get("/api/settings").json()["base_domain"] == "onyscribe.de" + assert client.get("/core").status_code == 200 + + +# ── schema-getriebene Container-Env ───────────────────────────────────────── + +def test_env_is_built_from_core_schema_and_picks_up_new_variables(client, monkeypatch): + client.put("/api/settings", json={"llm_model": "claude-x", "smtp_host": "smtp.test"}) + with session() as db: + env = deploy.build_env(db, db.get(Tenant, "sprinz"), reveal=False) + assert env["LLM_MODEL"] == "claude-x" and env["SMTP_HOST"] == "smtp.test" and env["TENANT"] == "sprinz" and "STT_PROVIDER" not in env + # Der Core deklariert eine neue geteilte Variable → sie landet ohne Admin-Änderung im Env + spec = contract.env_spec() + [{"name": "NEW_FEATURE_LEVEL", "kind": "setting", "scope": "shared", "setting": "new_feature_level", "group": "X", "label": "X"}] + monkeypatch.setattr(contract, "env_spec", lambda: spec) + client.put("/api/settings", json={"new_feature_level": "3"}) + with session() as db: + assert deploy.build_env(db, db.get(Tenant, "sprinz"), reveal=False)["NEW_FEATURE_LEVEL"] == "3" + + +def test_required_secrets_follow_schema_conditions(): + assert "MISTRAL_API_KEY" not in contract.required_secrets({"stt": {"provider": "cortecs"}}) + assert "MISTRAL_API_KEY" in contract.required_secrets({"stt": {"provider": "mistral"}}) + assert "MISTRAL_API_KEY" in contract.required_secrets({}) + assert {"OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET", "SESSION_SECRET", "COST_INGEST_KEY", "CORTECS_API_KEY"} <= set(contract.required_secrets({})) + + +# ── Health-Verifikation & Zustandsabgleich ────────────────────────────────── + +def health_body(sha="abcdef1234567", bundle=None, status="ok"): + return {"status": status, "tenant": "t", "core": {"version": sha, "contract": 1, "hook_api": 1}, "bundle": bundle or {"source": "git", "version": None, "stale": False, "error": None}} + + +def test_verify_health_accepts_correct_and_rejects_wrong_versions(): + logs = [] + deploy.verify_health("h", "abcdef1", None, logs.append, get=lambda u: (200, health_body()), tries=1) + assert any("✔" in l for l in logs) + with pytest.raises(DeployError, match="Core 1234567890 statt abcdef1"): + deploy.verify_health("h", "abcdef1", None, logs.append, get=lambda u: (200, health_body("1234567890abc")), tries=2, delay=0, sleep=lambda s: None) + with pytest.raises(DeployError, match="Bundle cache v2 \\(veraltet\\) statt admin v3"): + deploy.verify_health("h", None, 3, logs.append, get=lambda u: (200, health_body(bundle={"source": "cache", "version": 2, "stale": True})), tries=1) + with pytest.raises(DeployError, match="nicht erreichbar|Connect"): + def boom(u): + raise OSError("Connect refused") + deploy.verify_health("h", None, None, logs.append, get=boom, tries=2, delay=0, sleep=lambda s: None) + deploy.verify_health("h", "abcdef1", None, logs.append, get=lambda u: (200, {"status": "ok"}), tries=1) # Image vor dem Vertrag → nur Hinweis + assert any("Image vor dem Vertrag" in l for l in logs) + + +def test_status_probe_detects_drift(): + ok = status_svc.probe("h", "abcdef1234", 5, get=lambda u: (200, health_body("abcdef12349999", {"source": "admin", "version": 5, "stale": False}))) + assert ok["reachable"] and ok["drift"] == [] + bad = status_svc.probe("h", "abcdef1234", 5, get=lambda u: (200, health_body("0000000aaaa", {"source": "baked", "version": None, "stale": True}))) + assert len(bad["drift"]) == 2 + old = status_svc.probe("h", "abcdef1234", None, get=lambda u: (200, {"status": "ok"})) + assert "Core ohne Vertrag" in old["drift"][0] + down = status_svc.probe("h", "x", None, get=lambda u: (_ for _ in ()).throw(OSError("timeout"))) + assert not down["reachable"] and down["drift"] == ["nicht erreichbar"] + + +# ── Release-Eingang ───────────────────────────────────────────────────────── + +SHA_ADMIN = None + + +def _admin_sha(): + return contract.sha() + + +def test_release_intake_requires_token_and_is_idempotent(client, monkeypatch): + body = {"sha": _admin_sha(), "tag": _admin_sha(), "ref": "main", "image": "reg/x", "message": "Neuer Core"} + monkeypatch.delenv("CORE_RELEASE_TOKEN", raising=False) + assert client.post("/api/core/releases", json=body).status_code == 503 + monkeypatch.setenv("CORE_RELEASE_TOKEN", "geheim") + assert client.post("/api/core/releases", json=body, headers={"Authorization": "Bearer falsch"}).status_code == 401 + assert client.post("/api/core/releases", json={**body, "sha": "zzz"}, headers={"Authorization": "Bearer geheim"}).status_code == 400 + r = client.post("/api/core/releases", json=body, headers={"Authorization": "Bearer geheim"}).json() + assert r["created"] and r["admin_matches"] and r["status"] == "new" + assert not client.post("/api/core/releases", json=body, headers={"Authorization": "Bearer geheim"}).json()["created"] + other = client.post("/api/core/releases", json={**body, "sha": "f" * 40, "tag": "f" * 40, "message": "Fremder Core"}, headers={"Authorization": "Bearer geheim"}).json() + assert not other["admin_matches"] + + +def test_release_list_needs_session_when_auth_enabled(monkeypatch): + from app import auth + monkeypatch.setattr(auth, "AUTH_ENABLED", True) + with TestClient(app) as c: + assert c.get("/api/core/releases").status_code == 401 + monkeypatch.setenv("CORE_RELEASE_TOKEN", "geheim") + assert c.post("/api/core/releases", json={"sha": "a" * 40}, headers={"Authorization": "Bearer geheim"}).status_code == 200 # CI braucht keine Session + assert c.get("/api/tenants/demo/state").status_code == 401 + monkeypatch.setattr(auth, "AUTH_ENABLED", False) + + +# ── Kompatibilitätsprüfung & Freigabe ─────────────────────────────────────── + +def _rid(sha): + with session() as db: + return db.query(CoreRelease).filter_by(sha=sha).one().id + + +def test_check_requires_matching_admin_core(client): + rid = _rid("f" * 40) + r = client.post(f"/api/core/releases/{rid}/check", json={}) + assert r.status_code == 400 and "Admin" in r.json()["detail"] and "neu bauen" in r.json()["detail"] + + +def test_check_matrix_baseline_changes_and_approval_rules(client): + rid = _rid(_admin_sha()) + releases.check(rid, wait=True) + with session() as db: + c = db.get(CoreRelease, rid).compat + assert set(c["tenants"]) >= {"demo", "rotary-wil", "sprinz"} and c["summary"]["error"] == 0 + assert all(v["status"] == "new" for v in c["tenants"].values()) # noch keine Baseline + assert c["tenants"]["rotary-wil"]["fp"]["pdf_pages"] >= 1 + # Freigabe ohne Änderungen möglich + assert client.post(f"/api/core/releases/{rid}/approve", json={}).status_code == 200 + # Baseline setzen (wie nach einem erfolgreichen Rollout) und Core-Änderung simulieren + with session() as db: + for tid, v in c["tenants"].items(): + t = db.get(Tenant, tid) + t.render_baseline = {"version": t.current_version, "core": "alt", "fp": {**v["fp"], "pdf_text": "0" * 64}} + releases.check(rid, wait=True) + with session() as db: + c2 = db.get(CoreRelease, rid).compat + assert c2["tenants"]["sprinz"]["status"] == "changed" and "PDF-Text" in c2["tenants"]["sprinz"]["changed"] + r = client.post(f"/api/core/releases/{rid}/approve", json={}) + assert r.status_code == 400 and "bestätigen" in r.json()["detail"] + assert client.post(f"/api/core/releases/{rid}/approve", json={"acknowledge": True}).status_code == 200 + # unveränderte Baseline → ok + with session() as db: + for tid, v in c2["tenants"].items(): + t = db.get(Tenant, tid) + t.render_baseline = {"version": t.current_version, "core": "x", "fp": v["fp"]} + releases.check(rid, wait=True) + with session() as db: + assert db.get(CoreRelease, rid).compat["summary"]["ok"] >= 7 + + +def test_broken_tenant_blocks_approval(client): + rid = _rid(_admin_sha()) + client.put("/api/tenants/revier/files/protocol.html", json={"content": "{% for %}"}) + client.post("/api/tenants/revier/publish", json={"message": "kaputt"}) + releases.check(rid, wait=True) + with session() as db: + c = db.get(CoreRelease, rid).compat + assert c["tenants"]["revier"]["status"] == "error" and c["summary"]["error"] == 1 + r = client.post(f"/api/core/releases/{rid}/approve", json={"acknowledge": True}) + assert r.status_code == 400 and "revier" in r.json()["detail"] + client.post("/api/tenants/revier/versions/1/restore") # reparieren + client.post("/api/tenants/revier/publish", json={"message": "repariert"}) + releases.check(rid, wait=True) + assert client.post(f"/api/core/releases/{rid}/approve", json={"acknowledge": True}).status_code == 200 + + +# ── Rollout / Rollback ────────────────────────────────────────────────────── + +def _ready(client, tid): + """Tenant mit allen Pflicht-Secrets, Quelle git, OIDC-Verwaltung aus – bereit für einen (gefakten) Live-Deploy.""" + from app.services import tenants as tsvc + client.post("/api/tenants", json={"id": tid, "name": f"Tenant {tid}"}) # existiert er schon, bleibt er und wird nur reaktiviert + client.put(f"/api/tenants/{tid}/meta", json={"status": "active"}) + client.put(f"/api/tenants/{tid}/core-pin", json={"pin": ""}) + client.put(f"/api/tenants/{tid}/source", json={"source": "git"}) + client.put(f"/api/tenants/{tid}/oidc", json={"mode": "off"}) + with session() as db: + for k in ("OIDC_CLIENT_ID", "OIDC_CLIENT_SECRET", "COST_INGEST_KEY"): + tsvc.set_secret(db, tid, k, "x", "t") + + +class FakeMW: + def __init__(self): + self.calls, self.images = [], {} + + def __call__(self, method, url, headers, body): + path = url.split("/v2")[1] + self.calls.append((method, path)) + if method == "GET" and path.endswith("/stacks/s-1/"): + return 200, {"services": {"legacy": {"id": "svc-0"}, **{n: {"id": f"id-{n}"} for n in self.images}}}, "" + if method == "GET" and "ingresses" in path: + return 200, [], "" + if method == "GET" and "/projects/p-1/" in path: + return 200, {"id": "uuid"}, "" + if method == "PATCH": + for name, svc in ((body or {}).get("services") or {}).items(): + if svc: + self.images[name] = svc["image"] + return 200, {}, "" + + +@pytest.fixture() +def live_env(client, monkeypatch): + monkeypatch.setenv("DEPLOY_LIVE", "true") + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", "*") + monkeypatch.setenv("MITTWALD_API_TOKEN", "tok") + client.put("/api/settings", json={"mittwald_project_id": "p-1", "mittwald_stack_id": "s-1", "registry": "reg.test/o", "core_image_tag": "alt1234", "canary_tenants": "ro2"}) + client.put("/api/shared-secrets/CORTECS_API_KEY", json={"value": "ck"}) + with session() as db: # alle bestehenden Tenants aus dem Rollout nehmen (andere Tests laufen weiter gegen sie) + paused = [t.id for t in db.query(Tenant).filter(Tenant.status == "active")] + for t in db.query(Tenant): + t.status = "paused" + yield + with session() as db: + for t in db.query(Tenant): + t.status = "active" if t.id in paused else t.status + for t in db.query(Tenant).filter(Tenant.id.like("ro%")): + t.status = "archived" + + +def _approved_release(client, sha="c" * 40): + with session() as db: + r, _ = releases.announce(db, sha, sha, "main", "reg.test/o", "Rollout-Test") + r.status = "approved" + r.compat = {"tenants": {}, "summary": {}, "core_sha": sha, "running": False} + rid = r.id + return rid + + +def test_dry_run_rollout_changes_nothing(client, live_env, monkeypatch): + monkeypatch.delenv("DEPLOY_LIVE") + _ready(client, "ro1") + rid = _approved_release(client, "d" * 40) + mw = FakeMW() + batch, ids = releases.rollout(rid, "t", dry_run=True, http=mw, wait=True) + assert not [c for c in mw.calls if c[0] != "GET"] # Dry-Run liest höchstens + rows = client.get(f"/api/deployments?batch={batch}").json() + assert rows and all(r["status"] == "success" and r["kind"] == "dry-run" and r["image"] == "d" * 40 for r in rows) + with session() as db: + assert db.get(CoreRelease, rid).status == "approved" + assert deploy.setting(db, "core_image_tag") == "alt1234" + with pytest.raises(releases.ReleaseError, match="gesperrt"): + releases.rollout(rid, "t", dry_run=False) + + +def test_live_rollout_canary_first_pin_baseline_and_rollback(client, live_env): + for t in ("ro1", "ro2", "ro3"): + _ready(client, t) + client.put("/api/tenants/ro3/core-pin", json={"pin": "fest99"}) + rid = _approved_release(client, "e" * 40) + with session() as db: + db.get(CoreRelease, rid).compat = {"tenants": {"ro1": {"fp": {"x": 1}}, "ro2": {"fp": {"x": 2}}}, "summary": {}, "core_sha": "e" * 40, "running": False} + mw, seen = FakeMW(), [] + health = lambda host, tag, bundle, log: seen.append((host, tag)) # noqa: E731 + batch, _ = releases.rollout(rid, "t", dry_run=False, http=mw, health=health, wait=True) + rows = client.get(f"/api/deployments?batch={batch}").json() + assert [r["tenant"] for r in rows][0] == "ro2" and {r["tenant"] for r in rows} == {"ro1", "ro2"} # Canary zuerst, ro3 gepinnt → nicht dabei + assert all(r["status"] == "success" and not r["simulated"] for r in rows) + assert mw.images == {"app-ro1": f"reg.test/o/transkript-platform:{'e' * 40}", "app-ro2": f"reg.test/o/transkript-platform:{'e' * 40}"} + assert [t for _, t in seen] == ["e" * 40, "e" * 40] + with session() as db: + r = db.get(CoreRelease, rid) + assert r.status == "active" and r.previous_tag == "alt1234" and deploy.setting(db, "core_image_tag") == "e" * 40 + assert db.get(Tenant, "ro1").render_baseline["fp"] == {"x": 1} and db.get(Tenant, "ro1").deployed_image == "e" * 40 + assert deploy.image_ref(db, db.get(Tenant, "ro3")).endswith(":fest99") # Pin gewinnt + # Rollback aller Tenants auf den vorherigen Tag + mw2 = FakeMW() + releases.rollback_release(rid, "t", http=mw2, health=health, wait=True) + assert set(mw2.images.values()) == {"reg.test/o/transkript-platform:alt1234"} + with session() as db: + assert db.get(CoreRelease, rid).status == "rolled_back" and deploy.setting(db, "core_image_tag") == "alt1234" + + +def test_failed_canary_aborts_rollout_and_marks_release_failed(client, live_env): + for t in ("ro1", "ro2"): + _ready(client, t) + rid = _approved_release(client, "9" * 40) + mw = FakeMW() + + def health(host, tag, bundle, log): + if host.startswith("ro2."): + raise DeployError("Health-Check fehlgeschlagen: Core falsch") + + batch, _ = releases.rollout(rid, "t", dry_run=False, http=mw, health=health, wait=True) + rows = {r["tenant"]: r for r in client.get(f"/api/deployments?batch={batch}").json()} + assert rows["ro2"]["status"] == "failed" and rows["ro1"]["status"] == "cancelled" and "übersprungen" in rows["ro1"]["log"] + assert "app-ro1" not in mw.images # nichts ausgerollt + with session() as db: + assert db.get(CoreRelease, rid).status == "failed" and deploy.setting(db, "core_image_tag") == "alt1234" + + +def test_tenant_rollback_uses_previous_successful_live_tag(client, live_env, monkeypatch): + from app.services.mittwald import Mittwald + _ready(client, "ro4") + mw, health = FakeMW(), (lambda *a: None) + monkeypatch.setattr(deploy, "_client", lambda live, log, http=None: Mittwald("tok", "https://api.test/v2", live, log, mw)) + monkeypatch.setattr(deploy, "verify_health", lambda *a, **k: None) + deploy.start("ro4", "deploy", "t", http=mw, core_tag="1111111", health=health, wait=True) + deploy.start("ro4", "deploy", "t", http=mw, core_tag="2222222", health=health, wait=True) + with session() as db: + assert db.get(Tenant, "ro4").deployed_image == "2222222" and releases.tenant_rollback_tag(db, db.get(Tenant, "ro4")) == "1111111" + r = client.post("/api/tenants/ro4/rollback").json() + assert r["tag"] == "1111111" + time.sleep(1.5) + assert mw.images["app-ro4"].endswith(":1111111") + + +def test_rollout_blocked_for_unapproved_and_unsupported(client, live_env): + with session() as db: + r, _ = releases.announce(db, "8" * 40, "8" * 40, "main", "", "neu") + rid = r.id + with pytest.raises(releases.ReleaseError, match="erst prüfen und freigeben"): + releases.rollout(rid, "t", dry_run=False) + with pytest.raises(releases.ReleaseError): + releases.approve(session().__enter__(), rid, "t") + + +# ── Schreib-Freigabe pro Tenant (DEPLOY_ALLOWED_TENANTS) ─────────────────── + +def test_allowlist_parsing(monkeypatch): + from app.services import guard + monkeypatch.delenv("DEPLOY_ALLOWED_TENANTS", raising=False) + assert guard.allowed_tenants() == set() and not guard.live_allowed("demo") and guard.describe() == "keiner" + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", " demo-admin , x ") + assert guard.live_allowed("demo-admin") and guard.live_allowed("x") and not guard.live_allowed("demo") + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", "*") + assert guard.allowed_tenants() is None and guard.live_allowed("irgendwer") + + +def test_live_deploy_oidc_and_rollout_respect_allowlist(client, live_env, monkeypatch): + for t in ("ro1", "ro2"): + _ready(client, t) + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", "ro2") + # API: nicht freigegebener Tenant → 403, freigegebener → ok + assert client.post("/api/tenants/ro1/deploy", json={"dry_run": False}).status_code == 403 + assert client.post("/api/tenants/ro1/offboard", json={"dry_run": False}).status_code == 403 + assert client.post("/api/tenants/ro1/rollback").status_code == 403 + assert client.post("/api/tenants/ro1/oidc/sync", json={"apply": True}).status_code == 403 + dry = client.post("/api/tenants/ro1/deploy", json={"dry_run": True}) # Dry-Run immer erlaubt + assert dry.status_code == 200 + for _ in range(40): + if client.get(f"/api/deployments/{dry.json()['id']}").json()["status"] != "running": + break + time.sleep(0.25) + assert client.get("/api/deploy/mode").json()["allowed"] == "ro2" + # Engine blockiert auch direkt + d = client.get(f"/api/deployments/{deploy.start('ro1', 'deploy', 't', http=FakeMW(), health=lambda *a: None, wait=True)}").json() + assert d["status"] == "failed" and "nicht freigegeben" in d["log"] + # Rollout: nur ro2 wird live ausgerollt, ro1 bleibt unberührt + rid = _approved_release(client, "7" * 40) + mw = FakeMW() + batch, _ = releases.rollout(rid, "t", dry_run=False, http=mw, health=lambda *a: None, wait=True) + assert [r["tenant"] for r in client.get(f"/api/deployments?batch={batch}").json()] == ["ro2"] and list(mw.images) == ["app-ro2"] + # niemand freigegeben → Rollout wird abgelehnt + monkeypatch.delenv("DEPLOY_ALLOWED_TENANTS") + with pytest.raises(releases.ReleaseError, match="Kein Tenant für Live-Rollouts freigegeben"): + releases.rollout(rid, "t", dry_run=False) + + +# ── Vorflug-Check ─────────────────────────────────────────────────────────── + +def test_preflight_reports_problems_and_readiness(client, live_env, monkeypatch): + from tests.test_flow import FakeLogin # noqa: F401 + _ready(client, "pf1") + client.put("/api/settings", json={"admin_public_url": "", "core_supports_bundle": "false", "base_domain": "onyscribe.de"}) + client.put("/api/tenants/pf1/source", json={"source": "admin"}) + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", "") + mw = FakeMW() + from app.services import preflight + r = preflight.run("pf1", mw_http=mw, self_get=lambda u: 200) + lv = {i["id"]: i["level"] for i in r["items"]} + assert not r["ready"] and lv["bundle"] == "fail" and lv["adminurl"] == "fail" and lv["allow"] == "warn" and lv["stack"] == "ok" and lv["tag"] == "warn" + assert "legacy" in next(i for i in r["items"] if i["id"] == "stack")["detail"] # bestehende Services werden als „bleiben unangetastet“ gezeigt + assert [c for c in mw.calls if c[0] != "GET"] == [] # schreibt nie + # alles in Ordnung bringen + client.put("/api/settings", json={"admin_public_url": "https://admin.example.de", "core_supports_bundle": "true"}) + client.put("/api/tenants/pf1/core-pin", json={"pin": "a" * 40}) + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", "pf1") + r2 = preflight.run("pf1", mw_http=mw, self_get=lambda u: 200) + assert r2["ready"], [i for i in r2["items"] if i["level"] == "fail"] + bad = preflight.run("pf1", mw_http=mw, self_get=lambda u: 502) + assert not bad["ready"] and any(i["id"] == "adminreach" and i["level"] == "fail" for i in bad["items"]) + + +def test_live_deploy_requires_admin_public_url_for_admin_source(client, live_env): + _ready(client, "pf2") + client.put("/api/tenants/pf2/source", json={"source": "admin"}) + client.put("/api/settings", json={"core_supports_bundle": "true", "admin_public_url": ""}) + d = client.get(f"/api/deployments/{deploy.start('pf2', 'deploy', 't', http=FakeMW(), health=lambda *a: None, wait=True)}").json() + assert d["status"] == "failed" and "Öffentliche URL der Admin-Plattform" in d["log"] + assert client.get("/api/tenants/pf2/preflight").status_code == 200 diff --git a/tests/test_flow.py b/tests/test_flow.py new file mode 100644 index 0000000..8a7cf95 --- /dev/null +++ b/tests/test_flow.py @@ -0,0 +1,529 @@ +"""End-to-End-Test des Kernablaufs gegen eine temporäre SQLite-DB (echter Core-Render in der Sandbox).""" +import json +import os +import tarfile +import io +import tempfile +import time +from pathlib import Path + +_tmp = tempfile.mkdtemp() +os.environ["DATABASE_URL"] = f"sqlite:///{_tmp}/t.db" + +import pytest # noqa: E402 +from fastapi.testclient import TestClient # noqa: E402 + +from app.db import session # noqa: E402 +from app.main import app # noqa: E402 +from app.services.importer import import_all # noqa: E402 +from app.settings import LEGACY_PLATFORM # noqa: E402 + + +@pytest.fixture(scope="module") +def client(): + with TestClient(app) as c: + with session() as db: + import_all(db, Path(LEGACY_PLATFORM)) + yield c + + +def test_import_all_tenants(client): + for tid in ["demo", "onyva", "revier", "rotary", "rotary-wil", "sportklinik", "sprinz"]: + s = client.get(f"/api/tenants/{tid}/state").json() + assert s["current_version"] == 1 and s["config"]["id"] == tid and "deploy" not in s["config"] + + +def test_previews_render_with_real_core(client): + for tid in ("rotary-wil", "sprinz"): + assert client.get(f"/preview/{tid}/pdf").content[:5] == b"%PDF-" + html = client.get(f"/preview/{tid}/web").text + assert "@@" not in html and "= 7 and all(x["status"] == "success" for x in rows) + + +def test_mittwald_client_live_sequence_with_guard(): + """Gegen einen Fake-HTTP: richtige Reihenfolge, PATCH statt PUT, Guard gegen verschwundene Services.""" + from app.services.mittwald import DeployError, Mittwald + calls, lines = [], [] + stack = {"services": {"legacy": {"id": "svc-0"}, "app-x": {"id": "svc-1"}}} + + def http(method, url, headers, body): + calls.append((method, url.split("/v2")[1], body)) + if method == "GET" and url.endswith("/stacks/s-1/"): + return 200, stack, "" + if method == "GET" and "ingresses" in url: + return 200, [], "" + if method == "GET" and "/projects/p-1/" in url: + return 200, {"id": "uuid-1"}, "" + return 200, {}, "" + + mw = Mittwald("tok", "https://api.test/v2", True, lines.append, http) + mw.deploy_service(stack_id="s-1", service="app-x", volume="vol-x", definition={"image": "i"}, container_port="8276", + project_id="p-1", hostname="x.example.de") + verbs = [(m, p) for m, p, _ in calls] + assert ("PUT", "/stacks/s-1/") not in verbs + assert verbs.index(("PATCH", "/stacks/s-1/")) < verbs.index(("POST", "/stacks/s-1/services/svc-1/actions/recreate/")) + assert any(p == "/ingresses" and m == "POST" for m, p, _ in calls) + assert any("Guard" in l for l in lines) + # Guard schlägt an, wenn ein fremder Service verschwindet + state = {"n": 0} + + def http2(method, url, headers, body): + if method == "GET" and url.endswith("/stacks/s-1/"): + state["n"] += 1 + return 200, ({"services": {"legacy": {}}} if state["n"] == 1 else {"services": {"app-x": {"id": "svc-1"}}}), "" + return 200, {}, "" + + try: + Mittwald("tok", "https://api.test/v2", True, lambda m: None, http2).deploy_service( + stack_id="s-1", service="app-x", volume="vol-x", definition={}, container_port="8276", project_id="p-1", hostname=None) + raise AssertionError("Guard hat nicht angeschlagen") + except DeployError as exc: + assert "verschwunden" in str(exc) + + +def test_dry_run_client_never_writes(): + from app.services.mittwald import Mittwald + calls = [] + mw = Mittwald("tok", "https://api.test/v2", False, lambda m: None, lambda *a: calls.append(a) or (200, {}, "")) + mw.deploy_service(stack_id="s", service="app-x", volume="v", definition={"environment": {"X_SECRET": "geheim"}}, container_port="1", project_id="p", hostname="h.de") + assert all(c[0] == "GET" for c in calls) + + +def _sse(resp): + return [json.loads(l[6:]) for l in resp.text.split("\n\n") if l.startswith("data: ")] + + +def test_agent_mock_stream_and_apply(client): + r = client.post("/api/tenants/revier/chat", json={"message": "Setze die Akzentfarbe auf #0B6E4F"}) + ev = _sse(r) + assert [e["type"] for e in ev][0] == "mode" and ev[0]["backend"] == "mock" + assert any(e["type"] == "step" and e["tool"] == "validate" for e in ev) + msg = ev[-1]["message"] + assert msg["proposal_status"] == "open" + assert client.get("/api/tenants/revier/state").json()["config"]["colors"]["accent"] != "#0B6E4F" # Entwurf unberührt + d = client.get(f"/api/tenants/revier/chat/{msg['id']}/diff").json() + assert d["changed"] and "#0B6E4F" in json.dumps(d) + client.post(f"/api/tenants/revier/chat/{msg['id']}/apply") + assert client.get("/api/tenants/revier/state").json()["config"]["colors"]["accent"] == "#0B6E4F" + client.post("/api/tenants/revier/draft/discard") + + +def test_agent_tools_with_scripted_backend(client): + """Echter Loop + echte Tools + Core-Rendering, nur das LLM ist geskriptet.""" + from app.agent import loop + from app.agent.backends import Turn + + class Scripted: + name, model = "scripted", "x" + + def __init__(self): + self.i = 0 + + def step(self, system, messages, tools): + self.i += 1 + if self.i == 1: + return Turn([{"type": "tool_use", "id": "1", "name": "read_file", "input": {"path": "namensliste.txt"}}, + {"type": "tool_use", "id": "2", "name": "write_file", "input": {"path": "namensliste.txt", "content": "x"}}, + {"type": "tool_use", "id": "3", "name": "write_file", "input": {"path": "protocol.css", "content": "body{color:red}"}}, + {"type": "tool_use", "id": "4", "name": "write_file", "input": {"path": "overrides.py", "content": "def x(:"}}, + {"type": "tool_use", "id": "5", "name": "render_pdf", "input": {}}]) + return Turn([{"type": "text", "text": "Fertig."}]) + + with session() as db: + from app.models import Tenant + t = db.get(Tenant, "rotary-wil") + ev = list(loop.run(db, t, "teste", backend=Scripted())) + steps = [e for e in ev if e["type"] == "step"] + assert "gesperrt" in steps[0]["result"] # Namensliste für den Agenten unlesbar + assert steps[1]["error"] and "personenbezogen" in steps[1]["result"] # … und unveränderbar + assert not steps[2]["error"] + assert steps[3]["error"] # Syntaxfehler in overrides.py abgefangen + assert "Seite" in steps[4]["result"] + prop = [e for e in ev if e["type"] == "proposal"][0]["proposal"] + assert [i["path"] for i in prop["items"]] == ["protocol.css"] + with session() as db: # Entwurf bleibt unberührt, bis freigegeben + assert not db.get(Tenant, "rotary-wil").draft + + +def test_prompt_test_endpoint(client, monkeypatch): + from app.services import llm + monkeypatch.setattr(llm, "summarize", lambda db, system, user, model=None, tenant_id=None: {"text": "===TERMINART===\nKick-off\n===/TERMINART===", "model": "m", "input_tokens": 10, "output_tokens": 5, "truncated": False}) + r = client.post("/api/tenants/rotary-wil/prompt-test", json={}).json() + assert r["text"].startswith("===TERMINART") and r["prompt_chars"] > 1000 + # Namensregister landet über den build_prompt-Hook im finalen Prompt + from app.services import preview + with session() as db: + from app.models import Tenant + fin = preview.run(db, db.get(Tenant, "rotary-wil"), "draft", "prompt", args={"title": "x"})["prompt"] + assert "Namensregister des Clubs" in fin + + +def test_prompt_test_without_key_is_clean_error(client, monkeypatch): + monkeypatch.delenv("CORTECS_API_KEY", raising=False) + r = client.post("/api/tenants/sprinz/prompt-test", json={}) + assert r.status_code == 400 and "CORTECS_API_KEY" in r.json()["detail"] + + +def test_meta_archive_delete(client): + client.post("/api/tenants", json={"id": "wegdamit", "name": "Weg damit"}) + assert client.put("/api/tenants/wegdamit/meta", json={"cpu": 99}).status_code == 400 + assert client.put("/api/tenants/wegdamit/meta", json={"cpu": 1, "memory": "1G", "notes": "n"}).status_code == 200 + assert client.delete("/api/tenants/wegdamit?confirm=wegdamit").status_code == 400 # erst archivieren + client.put("/api/tenants/wegdamit/meta", json={"status": "archived"}) + assert client.delete("/api/tenants/wegdamit?confirm=falsch").status_code == 400 + assert client.delete("/api/tenants/wegdamit?confirm=wegdamit").status_code == 200 + assert client.get("/api/tenants/wegdamit/state").status_code == 404 + + +def test_oidc_login_flow_and_access_rules(monkeypatch): + from app import auth + monkeypatch.setattr(auth, "AUTH_ENABLED", True) + monkeypatch.setenv("OIDC_CLIENT_ID", "cid") + monkeypatch.setenv("OIDC_CLIENT_SECRET", "sec") + import base64 as b64 + idt = lambda claims: "h." + b64.urlsafe_b64encode(json.dumps(claims).encode()).decode().rstrip("=") + ".s" # noqa: E731 + with TestClient(app, follow_redirects=False) as c: + assert c.get("/").status_code == 302 and c.get("/").headers["location"] == "/auth/login" + assert c.get("/api/tenants/demo/state").status_code == 401 + assert c.get("/healthz").status_code == 200 + r = c.get("/auth/login") + assert r.status_code == 302 and "code_challenge_method=S256" in r.headers["location"] + state = dict(p.split("=") for p in r.headers["location"].split("?")[1].split("&"))["state"] + # Default-Deny: keine Zugriffsregel konfiguriert + monkeypatch.setattr(auth, "exchange_code", lambda code, cv: {"id_token": idt({"sub": "1", "email": "chef@onyva.de", "app_roles": ["admin"]})}) + assert c.get(f"/auth/callback?code=x&state={state}").status_code == 403 + # Mit Allowlist + monkeypatch.setenv("ADMIN_ALLOWED_EMAILS", "chef@onyva.de") + state2 = dict(p.split("=") for p in c.get("/auth/login").headers["location"].split("?")[1].split("&"))["state"] + ok = c.get(f"/auth/callback?code=x&state={state2}") + assert ok.status_code == 303 + assert c.get("/api/tenants/demo/state").status_code == 200 + assert c.get("/auth/me").json()["user"]["email"] == "chef@onyva.de" + # falscher State → neu starten, keine Session + with TestClient(app, follow_redirects=False) as c2: + c2.get("/auth/login") + assert c2.get("/auth/callback?code=x&state=falsch").headers["location"] == "/auth/login" + # Bundle bleibt tokenbasiert erreichbar (nicht über Cookie) + assert c2.get("/api/tenants/demo/bundle").status_code == 401 + monkeypatch.setattr(auth, "AUTH_ENABLED", False) + + +def test_messages_backend_talks_to_cortecs_endpoint(): + """Anthropic-SDK gegen Cortecs: richtige URL (/v1/messages), Bearer-Auth, Tool-Schema, Antwort-Parsing.""" + import anthropic + try: + import httpx2 as httpx # neuere Anthropic-SDKs bringen einen eigenen HTTP-Client mit + except ImportError: + import httpx + from app.agent.backends import MessagesBackend + from app.agent.tools import TOOLS + seen = {} + + def handler(req: httpx.Request): + seen["url"], seen["auth"], seen["body"] = str(req.url), req.headers.get("authorization"), json.loads(req.content) + return httpx.Response(200, json={"id": "m", "type": "message", "role": "assistant", "model": "x", "stop_reason": "tool_use", + "content": [{"type": "text", "text": "ok"}, {"type": "tool_use", "id": "t1", "name": "validate", "input": {}}], + "usage": {"input_tokens": 11, "output_tokens": 7}}) + + b = MessagesBackend("KEY", "https://api.cortecs.ai/v1", "claude-4-6-sonnet") + b.client = anthropic.Anthropic(api_key="KEY", auth_token="KEY", base_url="https://api.cortecs.ai", http_client=httpx.Client(transport=httpx.MockTransport(handler))) + turn = b.step("sys", [{"role": "user", "content": "hi"}], TOOLS) + assert seen["url"] == "https://api.cortecs.ai/v1/messages" and seen["auth"] == "Bearer KEY" + assert seen["body"]["model"] == "claude-4-6-sonnet" and {t["name"] for t in seen["body"]["tools"]} >= {"edit_file", "validate"} + assert turn.blocks[1] == {"type": "tool_use", "id": "t1", "name": "validate", "input": {}} and turn.usage == {"in": 11, "out": 7} + + +def test_chat_backend_message_conversion(): + from app.agent.backends import ChatBackend + conv = ChatBackend._convert("sys", [ + {"role": "user", "content": "los"}, + {"role": "assistant", "content": [{"type": "text", "text": "ich lese"}, {"type": "tool_use", "id": "a", "name": "read_file", "input": {"path": "x"}}]}, + {"role": "user", "content": [{"type": "tool_result", "tool_use_id": "a", "content": "inhalt"}]}]) + assert [m["role"] for m in conv] == ["system", "user", "assistant", "tool"] + assert conv[2]["tool_calls"][0]["function"]["name"] == "read_file" and conv[3]["tool_call_id"] == "a" + + +def test_plan_masks_secrets_but_not_tokens_limit(client): + p = client.get("/api/tenants/sprinz/plan").json()["patch"]["environment"] + assert p["LLM_MAX_TOKENS"] == "16000" and p["TENANT"] == "sprinz" and "TENANT_SOURCE" not in p + + +def test_final_prompt_and_files_privacy(client): + r = client.get("/api/tenants/rotary-wil/final-prompt").json() + assert "Namensregister des Clubs" in r["prompt"] + st = client.get("/api/tenants/rotary-wil/state").json() + assert st["files"]["namensliste.txt"]["personal"] is True + + +# ── OIDC-Abgleich gegen die Developer-API (Fake-Login-Server) ─────────────── + +from tests.fakelogin import FakeLogin # noqa: E402 + + +@pytest.fixture() +def login(monkeypatch): + from app.services import onyva_login + fake = FakeLogin() + monkeypatch.setenv("ONYVA_LOGIN_API_KEY", "onyva_testkey") + monkeypatch.setenv("OIDC_SYNC_LIVE", "true") + monkeypatch.setenv("DEPLOY_ALLOWED_TENANTS", "*") + monkeypatch.setattr(onyva_login, "client_from_env", + lambda db, http=None: onyva_login.OnyvaLogin("https://login.test/api/v1", "onyva_testkey", fake, sleep=lambda s: None)) + return fake + + +def _secret_value(tenant, key): + from app.models import Secret + from app.services import crypto + from sqlalchemy import select + with session() as db: + r = db.scalar(select(Secret).where(Secret.tenant_id == tenant, Secret.key == key)) + return crypto.decrypt(r.value_enc) if r and r.value_enc else None + + +def test_oidc_creates_app_stores_secret_and_is_idempotent(client, login): + client.post("/api/tenants", json={"id": "klinik1", "name": "Klinik Eins"}) + client.put("/api/tenants/klinik1/oidc", json={"members": [{"email": "anna@x.de", "role": "editor"}, {"email": "ghost@x.de", "role": "viewer"}]}) + plan = client.post("/api/tenants/klinik1/oidc/sync", json={"apply": False}).json() + assert plan["ok"] and [a["kind"] for a in plan["actions"]][0] == "create" and not login.writes # Dry-Run schreibt nichts + rep = client.post("/api/tenants/klinik1/oidc/sync", json={"apply": True}).json() + assert rep["created"] and rep["client_id"] == "app_0001" + app = login.apps["app_0001"] + assert app["redirect_uris"] == ["https://klinik1.onyscribe.de/auth/callback"] and app["auth_mode"] == "required" + assert _secret_value("klinik1", "OIDC_CLIENT_ID") == "app_0001" and _secret_value("klinik1", "OIDC_CLIENT_SECRET") == "secret-1" + assert login.members["app_0001"] == {"anna@x.de": "editor"} and any("ghost@x.de" in w for w in rep["warnings"]) + login.calls.clear() + again = client.post("/api/tenants/klinik1/oidc/sync", json={"apply": True}).json() + assert [a["kind"] for a in again["actions"]] == ["member_put"] and not any(c[0] in ("POST",) for c in login.writes) # nur der (weiter fehlende) Geist-Nutzer + assert client.get("/api/tenants/klinik1/oidc").json()["last_sync"]["ok"] + + +def test_oidc_adopt_only_adds_missing_redirect(client, login): + from app.services import tenants as tsvc + login.apps["app_legacy"] = {"client_id": "app_legacy", "name": "Alt", "redirect_uris": ["https://wil-rotary.onyscribe.de/auth/callback", "https://alt.example/cb"], + "auth_mode": "optional", "totp_mode": "required", "allow_registration": True, "backchannel_logout_uri": None} + with session() as db: + tsvc.set_secret(db, "rotary-wil", "OIDC_CLIENT_ID", "app_legacy", "t") + tsvc.set_secret(db, "rotary-wil", "OIDC_CLIENT_SECRET", "legacy-secret", "t") + client.put("/api/tenants/rotary-wil/meta", json={}) + client.put("/api/tenants/rotary-wil/domain", json={"subdomain": "wil-rotary"}) + rep = client.post("/api/tenants/rotary-wil/oidc/sync", json={"apply": True}).json() + assert rep["ok"] and not rep["created"] and not rep["warnings"] + assert login.apps["app_legacy"]["redirect_uris"][-1:] == ["https://alt.example/cb"] and login.apps["app_legacy"]["auth_mode"] == "optional" # nichts Fremdes verändert + assert _secret_value("rotary-wil", "OIDC_CLIENT_SECRET") == "legacy-secret" + # Subdomain ändern → adopt ergänzt nur die neue URI + client.put("/api/tenants/rotary-wil/domain", json={"subdomain": "neu"}) + client.post("/api/tenants/rotary-wil/oidc/sync", json={"apply": True}) + assert "https://neu.onyscribe.de/auth/callback" in login.apps["app_legacy"]["redirect_uris"] and len(login.apps["app_legacy"]["redirect_uris"]) == 3 + client.put("/api/tenants/rotary-wil/domain", json={"subdomain": "wil-rotary"}) + + +def test_oidc_managed_corrects_drift_and_exact_members(client, login): + client.post("/api/tenants", json={"id": "klinik2", "name": "Klinik Zwei"}) + client.put("/api/tenants/klinik2/oidc", json={"members": [{"email": "anna@x.de", "role": "viewer"}], "members_mode": "exact", "totp_mode": "optional"}) + client.post("/api/tenants/klinik2/oidc/sync", json={"apply": True}) + cid = _secret_value("klinik2", "OIDC_CLIENT_ID") + assert login.apps[cid]["totp_mode"] == "optional" + login.apps[cid].update(auth_mode="disabled", redirect_uris=["https://evil.example/cb"]) # Drift + login.members[cid]["bob@x.de"] = "admin" # fremde Freigabe + rep = client.post("/api/tenants/klinik2/oidc/sync", json={"apply": True}).json() + assert login.apps[cid]["auth_mode"] == "required" and login.apps[cid]["redirect_uris"] == ["https://klinik2.onyscribe.de/auth/callback"] + assert "bob@x.de" not in login.members[cid] and {a["kind"] for a in rep["actions"]} >= {"patch", "member_delete"} + + +def test_oidc_stale_client_id_recreates_and_rotate(client, login): + from app.services import tenants as tsvc + client.post("/api/tenants", json={"id": "klinik3", "name": "Klinik Drei"}) + with session() as db: + tsvc.set_secret(db, "klinik3", "OIDC_CLIENT_ID", "app_gone", "t") + rep = client.post("/api/tenants/klinik3/oidc/sync", json={"apply": True}).json() + assert rep["created"] and any("existiert im Login nicht mehr" in w for w in rep["warnings"]) + assert _secret_value("klinik3", "OIDC_CLIENT_ID") != "app_gone" + old = _secret_value("klinik3", "OIDC_CLIENT_SECRET") + client.post("/api/tenants/klinik3/oidc/sync", json={"apply": True, "rotate": True}) + assert _secret_value("klinik3", "OIDC_CLIENT_SECRET") not in (None, old) + + +def test_oidc_write_gate_and_missing_key(client, monkeypatch): + monkeypatch.delenv("OIDC_SYNC_LIVE", raising=False) + monkeypatch.delenv("DEPLOY_LIVE", raising=False) + assert client.post("/api/tenants/sprinz/oidc/sync", json={"apply": True}).status_code == 403 + monkeypatch.delenv("ONYVA_LOGIN_API_KEY", raising=False) + r = client.post("/api/tenants/sprinz/oidc/sync", json={"apply": False}).json() + assert r["ok"] and "ONYVA_LOGIN_API_KEY" in r["skipped"] + assert client.delete("/api/tenants/sprinz/oidc/app?confirm=sprinz").status_code == 403 + assert client.put("/api/tenants/sprinz/oidc", json={"mode": "kaputt"}).status_code == 400 + assert client.put("/api/tenants/sprinz/oidc", json={"members": [{"email": "keine-mail"}]}).status_code == 400 + + +def test_oidc_rate_limit_retry_and_bad_key(): + from app.services import onyva_login + fake = FakeLogin() + waits = [] + c = onyva_login.OnyvaLogin("https://login.test/api/v1", "onyva_testkey", fake, sleep=waits.append) + fake.rate_limit_once = True + assert c.list_apps() == [] and waits == [2] + try: + onyva_login.OnyvaLogin("https://login.test/api/v1", "falsch", fake, sleep=lambda s: None).list_apps() + raise AssertionError + except onyva_login.OnyvaError as exc: + assert "401" in str(exc) + + +def test_oidc_import_members_and_delete_app(client, login): + client.post("/api/tenants", json={"id": "klinik4", "name": "Klinik Vier"}) + client.post("/api/tenants/klinik4/oidc/sync", json={"apply": True}) + cid = _secret_value("klinik4", "OIDC_CLIENT_ID") + login.members[cid]["bob@x.de"] = "admin" + got = client.post("/api/tenants/klinik4/oidc/import-members").json() + assert got["members"] == [{"email": "bob@x.de", "role": "admin"}] + assert client.delete("/api/tenants/klinik4/oidc/app?confirm=nein").status_code == 400 + assert client.delete("/api/tenants/klinik4/oidc/app?confirm=klinik4").status_code == 200 + assert cid not in login.apps and _secret_value("klinik4", "OIDC_CLIENT_ID") is None + + +def test_deploy_runs_oidc_sync_before_service_patch(client, login, monkeypatch): + """Live-Deploy (alles gefakt): OIDC-Client wird VOR dem Service-PATCH angelegt und landet in dessen Env; Fehler bricht ab.""" + from app.services import deploy + client.post("/api/tenants", json={"id": "klinik5", "name": "Klinik Fünf"}) + client.put("/api/tenants/klinik5/source", json={"source": "git"}) + client.put("/api/settings", json={"mittwald_project_id": "p-1", "mittwald_stack_id": "s-1", "registry": "reg.test/o"}) + monkeypatch.setenv("DEPLOY_LIVE", "true") + monkeypatch.setenv("MITTWALD_API_TOKEN", "tok") + # Pflicht-Secrets laut Core-Schema: erst fehlen sie → Deploy wird VOR dem Service-Eingriff blockiert + blocked = deploy.start("klinik5", "deploy", "test", http=lambda *a: (200, {}, ""), oidc_client=None, wait=True, health=lambda *a: None) + d0 = client.get(f"/api/deployments/{blocked}").json() + assert d0["status"] == "failed" and ("COST_INGEST_KEY" in d0["log"] or "OIDC-Abgleich" in d0["log"] or "ONYVA_LOGIN_API_KEY" in d0["log"]) + client.put("/api/shared-secrets/CORTECS_API_KEY", json={"value": "ck"}) + client.put("/api/tenants/klinik5/secrets/COST_INGEST_KEY", json={"value": "ik"}) + order = [] + stack = {"services": {"legacy": {"id": "svc-0"}, "app-klinik5": {"id": "svc-5"}}} + + def mw_http(method, url, headers, body): + order.append(("mittwald", method, url.split("/v2")[1], body)) + if method == "GET" and url.endswith("/stacks/s-1/"): + return 200, stack, "" + if method == "GET" and "ingresses" in url: + return 200, [], "" + if method == "GET" and "/projects/p-1/" in url: + return 200, {"id": "uuid-1"}, "" + return 200, {}, "" + + class Spy(FakeLogin): + def __call__(self, method, url, headers, body): + order.append(("login", method, url.split("/api/v1")[1], body)) + return super().__call__(method, url, headers, body) + + spy = Spy() + from app.services import onyva_login + oc = onyva_login.OnyvaLogin("https://login.test/api/v1", "onyva_testkey", spy, sleep=lambda s: None) + dep = deploy.start("klinik5", "deploy", "test", http=mw_http, oidc_client=oc, wait=True, health=lambda *a: None) + d = client.get(f"/api/deployments/{dep}").json() + assert d["status"] == "success", d["log"] + first_login_write = next(i for i, o in enumerate(order) if o[0] == "login" and o[1] == "POST") + first_patch = next(i for i, o in enumerate(order) if o[0] == "mittwald" and o[1] == "PATCH") + assert first_login_write < first_patch + env = next(o[3]["services"]["app-klinik5"]["environment"] for o in order if o[0] == "mittwald" and o[1] == "PATCH" and o[3].get("services")) + assert env["OIDC_CLIENT_ID"] == "app_0001" and env["OIDC_CLIENT_SECRET"] == "secret-1" and env["OIDC_REDIRECT_URI"].startswith("https://klinik5.") + # Login-API kaputt → Deploy bricht VOR dem Service-PATCH ab + order.clear() + client.put("/api/tenants/klinik5/oidc", json={"auth_mode": "optional"}) + bad = onyva_login.OnyvaLogin("https://login.test/api/v1", "falscher-key", spy, sleep=lambda s: None) + dep2 = deploy.start("klinik5", "deploy", "test", http=mw_http, oidc_client=bad, wait=True, health=lambda *a: None) + d2 = client.get(f"/api/deployments/{dep2}").json() + assert d2["status"] == "failed" and "OIDC-Abgleich fehlgeschlagen" in d2["log"] + assert not any(o[0] == "mittwald" and o[1] == "PATCH" for o in order) + + +def test_dry_run_deploy_shows_oidc_plan_without_writes(client, login, monkeypatch): + monkeypatch.delenv("DEPLOY_LIVE", raising=False) + monkeypatch.delenv("OIDC_SYNC_LIVE", raising=False) + from app.services import deploy + client.post("/api/tenants", json={"id": "klinik6", "name": "Klinik Sechs"}) + dep = deploy.start("klinik6", "dry-run", "test", wait=True) + d = client.get(f"/api/deployments/{dep}").json() + assert d["status"] == "success" and "würde App" in d["log"] and not login.writes diff --git a/vendor/platform/CORE_VERSION b/vendor/platform/CORE_VERSION new file mode 100644 index 0000000..ca68dcd --- /dev/null +++ b/vendor/platform/CORE_VERSION @@ -0,0 +1 @@ +13055b811ca0030841f41ce1f10e4f30cba1a7db admin-platform-integration diff --git a/vendor/platform/core/BUILD_INFO.json b/vendor/platform/core/BUILD_INFO.json new file mode 100644 index 0000000..65fb146 --- /dev/null +++ b/vendor/platform/core/BUILD_INFO.json @@ -0,0 +1 @@ +{"sha": "13055b811ca0030841f41ce1f10e4f30cba1a7db", "built_at": "2026-10-15T13:26:28Z"} diff --git a/vendor/platform/core/__init__.py b/vendor/platform/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/vendor/platform/core/app.py b/vendor/platform/core/app.py new file mode 100644 index 0000000..e04640e --- /dev/null +++ b/vendor/platform/core/app.py @@ -0,0 +1,1637 @@ +"""Tenant-aware FastAPI application. + +The transcription / summarisation / delivery logic is identical for every +customer (the "core"). Everything brand- or customer-specific is pulled from +the active tenant config (core.config.CFG) and optional code hooks +(core.hooks). The tenant is selected once per process via the TENANT env var. +""" +from __future__ import annotations + +import base64 +import hashlib +import hmac +import html +import io +import json +import os +import re +import secrets +import smtplib +import subprocess +import tempfile +import threading +import time +import uuid +import warnings +from contextlib import asynccontextmanager +from datetime import datetime +from email.mime.application import MIMEApplication +from email.mime.multipart import MIMEMultipart +from email.mime.text import MIMEText +from pathlib import Path +from urllib import error as urllib_error +from urllib.parse import quote, urlencode +from urllib import request as urllib_request + +import requests +from dotenv import load_dotenv + +load_dotenv() + +from fastapi import BackgroundTasks, Depends, FastAPI, File, Form, HTTPException, Request, UploadFile +from fastapi.responses import FileResponse, HTMLResponse, RedirectResponse, Response + +from core import contract, cost, retry +from core.config import CFG, CORE_TEMPLATES +from core.hooks import load_hooks +from core.docx_export import render_docx +from core.pdf import build_pdf_context, render_pdf +from core.protocol import ( + normalize_protocol_text, + parse_protocol_sections, + project_label, + safe_filename, +) + +warnings.filterwarnings("ignore", category=UserWarning) + +HOOKS = load_hooks(CFG.dir) + +MAX_FILE_SIZE = int(os.getenv("MAX_FILE_SIZE_MB", "300")) * 1024 * 1024 +ALLOWED_CONTENT_TYPES = { + "audio/mpeg", "audio/mp3", "audio/webm", "audio/ogg", "audio/wav", + "audio/flac", "audio/x-flac", "audio/aac", "audio/x-m4a", "audio/mp4", + "video/mp4", "video/webm", "video/quicktime", "video/x-m4v", +} +# Tuples, not sets: the order is user-visible in the "Erlaubt sind: ..." error +# messages and in the accept-attributes rendered into the frontend. +ALLOWED_UPLOAD_SUFFIXES = ( + ".mp3", ".webm", ".wav", ".ogg", ".flac", ".aac", ".m4a", ".mp4", ".m4v", ".mov", +) +ALLOWED_TRANSCRIPT_SUFFIXES = (".txt", ".vtt", ".docx", ".md") +ALLOWED_VOCABULARY_SUFFIXES = (".txt",) +# Several recordings of one meeting (e.g. split into parts) can be uploaded +# together; they are joined in the given order and transcribed as one file. +# On by default, a tenant switches it off with "flags": {"multi_audio": false}. +MAX_AUDIO_FILES = 5 if CFG.flag("multi_audio", True) else 1 +# Voxtral Mini Transcribe V2 takes up to 3 h of audio per request (Mistral +# docs). Longer recordings are rejected before the STT call with a clear +# message instead of a provider error after the upload. +MAX_AUDIO_SECONDS = int(os.getenv("STT_MAX_AUDIO_MINUTES", "180")) * 60 + + +def _unsupported_format_detail(kind: str, suffix: str, allowed: tuple[str, ...]) -> str: + shown = suffix or "(ohne Dateiendung)" + return f"Nicht unterstütztes {kind}: {shown}. Erlaubt sind: {', '.join(allowed)}" + + +SEND_JOBS: dict[str, dict] = {} +SEND_JOBS_LOCK = threading.Lock() +# Background transcription jobs. The browser uploads, gets a job_id back +# immediately and then polls /transcribe-status — so no single HTTP request +# sits idle long enough to hit the ~10s reverse-proxy timeout. This in-memory +# store only works with a single worker process (see CMD in the Dockerfile). +TRANSCRIBE_JOBS: dict[str, dict] = {} +TRANSCRIBE_JOBS_LOCK = threading.Lock() +# Background summarisation jobs — same rationale as TRANSCRIBE_JOBS: the LLM call +# can run well past the ~10s reverse-proxy idle timeout (long protocols), so the +# browser uploads, gets a job_id and polls /summarize-status. Single worker only. +SUMMARIZE_JOBS: dict[str, dict] = {} +SUMMARIZE_JOBS_LOCK = threading.Lock() +DATA_DIR = Path(os.getenv("DATA_DIR", str(CFG.dir))) +VOCAB_FILE = DATA_DIR / "vocabulary.json" +VOCAB_LOCK = threading.Lock() +TEMP_DIR = Path(os.getenv("TEMP_DIR", tempfile.gettempdir())) / "meeting-transcript" +TEMP_DIR.mkdir(parents=True, exist_ok=True) + +AUTH_COOKIE = f"{CFG.id}_session" +AUTH_ENABLED = os.getenv("AUTH_ENABLED", "true").lower() == "true" +AUTH_COOKIE_SECURE = os.getenv("APP_COOKIE_SECURE", "false").lower() == "true" +SESSION_SECRET = os.getenv("SESSION_SECRET", os.getenv("APP_SESSION_SECRET", "")).strip() +OIDC_ISSUER = os.getenv("OIDC_ISSUER", "https://login.onyva.dev").strip() +OIDC_CLIENT_ID = os.getenv("OIDC_CLIENT_ID", "").strip() +OIDC_CLIENT_SECRET = os.getenv("OIDC_CLIENT_SECRET", "").strip() +OIDC_REDIRECT_URI = os.getenv("OIDC_REDIRECT_URI", "http://localhost:8000/auth/callback").strip() +OIDC_LOGOUT_REDIRECT_URI = os.getenv("OIDC_LOGOUT_REDIRECT_URI", "http://localhost:8000/").strip() +# The pending login (state + PKCE verifier) lives in a signed, short-lived cookie +# on the client — NOT in process memory, so a container restart or redeploy in the +# middle of a login no longer invalidates it. +OAUTH_STATE_COOKIE = f"{CFG.id}_oauth" +OAUTH_STATE_TTL = 10 * 60 +# Marker appended to the state of an automatically retried login. The IdP echoes +# the state back verbatim, so it survives the round trip even when the browser +# keeps no cookie at all — which is what makes it a reliable loop breaker. +OAUTH_RETRY_MARKER = "~r" + + +class NoSpeechDetectedError(RuntimeError): + pass + + +class AudioTooLongError(RuntimeError): + pass + + +@asynccontextmanager +async def lifespan(app: FastAPI): + _stt = _health_stt() + print(f"Server startet – Tenant: {CFG.id} ({CFG.name}) – " + f"STT: Voxtral via {_stt['provider']} ({_stt.get('model', '?')})") + cost.start_worker() + yield + cost.flush_now() + print("Server fährt herunter.") + + +app = FastAPI(lifespan=lifespan) + + +# ── auth / session ─────────────────────────────────────────────────────────── + + +def _decode_jwt_claims(token: str) -> dict: + try: + payload_b64 = token.split(".")[1] + payload_b64 += "=" * (4 - len(payload_b64) % 4) + return json.loads(base64.urlsafe_b64decode(payload_b64).decode()) + except Exception: + return {} + + +def _sign_payload(data: dict) -> str: + payload = base64.urlsafe_b64encode(json.dumps(data, separators=(",", ":")).encode()).decode().rstrip("=") + sig = hmac.new(SESSION_SECRET.encode(), payload.encode(), hashlib.sha256).hexdigest() + return f"{payload}.{sig}" + + +def _verify_payload(token: str) -> dict | None: + try: + payload, _, sig = token.partition(".") + if not sig or not SESSION_SECRET: + return None + expected = hmac.new(SESSION_SECRET.encode(), payload.encode(), hashlib.sha256).hexdigest() + if not hmac.compare_digest(sig, expected): + return None + payload += "=" * (4 - len(payload) % 4) + return json.loads(base64.urlsafe_b64decode(payload).decode()) + except Exception: + return None + + +def _get_session_user(request: Request) -> dict | None: + if not AUTH_ENABLED: + return {"sub": "user:0", "email": "dev@local", "name": "Dev", "user_type": "employee", "app_roles": ["admin"]} + token = request.cookies.get(AUTH_COOKIE, "") + return _verify_payload(token) if token else None + + +def require_auth(request: Request) -> dict: + user = _get_session_user(request) + if user is None: + raise HTTPException(status_code=401, detail="Nicht angemeldet") + return user + + +def _set_session(response: Response, user: dict) -> None: + response.set_cookie( + AUTH_COOKIE, _sign_payload(user), max_age=12 * 60 * 60, + httponly=True, secure=AUTH_COOKIE_SECURE, samesite="lax", + ) + + +def _set_pending_login(response: Response, state: str, code_verifier: str) -> None: + # SameSite=lax is required: the IdP sends the browser back via a top-level GET, + # which is exactly the case lax still allows. + payload = {"state": state, "cv": code_verifier, "exp": int(time.time()) + OAUTH_STATE_TTL} + response.set_cookie( + OAUTH_STATE_COOKIE, _sign_payload(payload), max_age=OAUTH_STATE_TTL, + httponly=True, secure=AUTH_COOKIE_SECURE, samesite="lax", + ) + + +def _pending_login_verifier(request: Request, state: str) -> str | None: + """PKCE verifier for `state`, or None if the cookie is missing, expired, + tampered with or belongs to a different login attempt.""" + token = request.cookies.get(OAUTH_STATE_COOKIE, "") + data = _verify_payload(token) if token else None + if not data or int(data.get("exp", 0)) < time.time(): + return None + if not hmac.compare_digest(str(data.get("state", "")), state): + return None + return data.get("cv") or None + + +# ── audio helpers ──────────────────────────────────────────────────────────── + + +def _ffmpeg_executable() -> str: + import shutil + found = shutil.which("ffmpeg") + if found: + return found + winget_root = Path(os.environ.get("LOCALAPPDATA", "C:/Users")) / "Microsoft/WinGet/Packages" + for candidate in sorted(winget_root.glob("Gyan.FFmpeg_*/ffmpeg-*/bin/ffmpeg.exe"), reverse=True): + if candidate.exists(): + return str(candidate) + raise RuntimeError("ffmpeg nicht gefunden. Bitte installieren: winget install Gyan.FFmpeg") + + +def _audio_duration_seconds(path: Path) -> float: + """Media duration in seconds via ffprobe (best effort; 0.0 on failure). + + Used for STT cost which is billed per audio minute — Mistral's response + carries no usage figure.""" + ffprobe = (_ffmpeg_executable().replace("ffmpeg", "ffprobe") + if "ffmpeg" in _ffmpeg_executable() else "ffprobe") + try: + r = subprocess.run( + [ffprobe, "-v", "error", "-show_entries", "format=duration", + "-of", "default=noprint_wrappers=1:nokey=1", str(path)], + capture_output=True, text=True, + ) + return float(r.stdout.strip()) if r.returncode == 0 and r.stdout.strip() else 0.0 + except Exception: + return 0.0 + + +# Video containers whose audio track must be extracted before transcription. +_VIDEO_SUFFIXES = {".mp4", ".m4v", ".mov", ".webm"} + + +def extract_audio_if_video(input_path: Path) -> tuple[Path, bool]: + """Mistral transcribes audio files directly. For video containers we extract + the audio track to mp3 first. Returns (path, created_temp).""" + if input_path.suffix.lower() not in _VIDEO_SUFFIXES: + return input_path, False + output_path = input_path.with_suffix(".extracted.mp3") + r = subprocess.run( + [_ffmpeg_executable(), "-y", "-i", str(input_path), "-vn", "-ac", "1", + "-ar", "16000", "-b:a", "96k", str(output_path)], + capture_output=True, text=True, + ) + if r.returncode != 0: + raise RuntimeError(f"ffmpeg fehlgeschlagen:\n{r.stderr}") + return output_path, True + + +def concat_audio(paths: list[Path]) -> Path: + """Join several audio/video files, in the given order, into one mono mp3. + + The STT call then sees a single recording, so diarization keeps the same + speaker ids across all parts (transcribing the parts separately would + restart at SPRECHER_0 in every file). Every input is resampled to the same + format first because the concat filter needs matching streams.""" + output_path = TEMP_DIR / f"{uuid.uuid4()}.merged.mp3" + cmd = [_ffmpeg_executable(), "-y"] + for p in paths: + cmd += ["-i", str(p)] + chains = "".join( + f"[{i}:a:0]aresample=16000,aformat=channel_layouts=mono[a{i}];" + for i in range(len(paths)) + ) + joined = "".join(f"[a{i}]" for i in range(len(paths))) + cmd += ["-filter_complex", f"{chains}{joined}concat=n={len(paths)}:v=0:a=1[out]", + "-map", "[out]", "-b:a", "96k", str(output_path)] + r = subprocess.run(cmd, capture_output=True, text=True) + if r.returncode != 0: + output_path.unlink(missing_ok=True) + raise RuntimeError(f"Zusammenfügen der Audiodateien fehlgeschlagen:\n{r.stderr[-1500:]}") + return output_path + + +def normalize_language(language: str) -> str: + lang = (language or "de").strip().lower() + return "en" if lang.startswith("en") else "de" + + +# ── Voxtral transcription (Mistral direkt oder via Cortecs) ────────────────── +# +# Beide Anbieter sprechen dieselbe Wire-API (Mistral-Format: multipart-Request +# mit diarize/timestamp_granularities/context_bias, Antwort mit segments + +# speaker_id) — Cortecs reicht die Voxtral-Aufrufe durch. Deshalb unterscheiden +# sich nur Endpunkt, API-Key und Modell-ID; Request-Bau und Parser sind geteilt. +# +# Auswahl pro Tenant über tenants//tenant.json: +# "stt": { "provider": "cortecs", "model": "voxtral-mini-transcribe-2602" } +# Ohne Eintrag bleibt es bei Mistral direkt. Env-Variablen (STT_PROVIDER, +# STT_MODEL bzw. MISTRAL_TRANSCRIBE_MODEL) überschreiben die tenant.json. + +_STT_PROVIDERS = { + "mistral": { + "url": "https://api.mistral.ai/v1/audio/transcriptions", + "key_env": "MISTRAL_API_KEY", + "model": "voxtral-mini-latest", + # $0.003/min → €0.002625/min (1 USD ≈ €0.875) + "cost_per_minute": 0.002625, + }, + "cortecs": { + "url": None, # aus CORTECS_BASE_URL abgeleitet + "key_env": "CORTECS_API_KEY", + "model": "voxtral-mini-transcribe-2602", + # Cortecs rechnet Voxtral nativ in EUR ab (Stand 12.08.2026). + "cost_per_minute": 0.003, + }, +} + + +def _stt_config() -> dict: + """Resolve the STT provider for this tenant. + + Precedence: env > tenant.json "stt" > provider default. + """ + tenant_stt = CFG.stt or {} + provider = (os.getenv("STT_PROVIDER") or tenant_stt.get("provider") or "mistral").strip().lower() + spec = _STT_PROVIDERS.get(provider) + if spec is None: + raise RuntimeError( + f"Unbekannter STT-Provider '{provider}'. Erlaubt: {', '.join(sorted(_STT_PROVIDERS))}" + ) + + url = spec["url"] + if provider == "cortecs": + base = os.getenv("CORTECS_BASE_URL", "https://api.cortecs.ai/v1").strip().rstrip("/") + url = f"{base}/audio/transcriptions" + + # MISTRAL_TRANSCRIBE_MODEL wird global an alle Container verteilt (SHARED_ENV) + # und gilt daher nur für den Mistral-Provider — sonst würde es die Modell-ID + # eines Cortecs-Tenants überschreiben. STT_MODEL wirkt providerübergreifend. + legacy_model = os.getenv("MISTRAL_TRANSCRIBE_MODEL") if provider == "mistral" else None + model = (os.getenv("STT_MODEL") or legacy_model + or tenant_stt.get("model") or spec["model"]).strip() + cost_per_minute = float(tenant_stt.get("cost_per_minute") or spec["cost_per_minute"]) + + return { + "provider": provider, + "url": url, + "key_env": spec["key_env"], + "model": model, + "diarize": os.getenv("STT_DIARIZE", os.getenv("MISTRAL_DIARIZE", "true")).lower() == "true", + "timeout": int(os.getenv("STT_TIMEOUT", os.getenv("MISTRAL_TIMEOUT", "600"))), + "cost_per_minute": cost_per_minute, + } + + +def _stt_api_key(cfg: dict) -> str: + key = os.getenv(cfg["key_env"], "").strip() + if not key: + raise RuntimeError(f"{cfg['key_env']} nicht gesetzt") + return key + + +def _load_vocabulary() -> list[str]: + with VOCAB_LOCK: + if not VOCAB_FILE.exists(): + return [] + try: + data = json.loads(VOCAB_FILE.read_text(encoding="utf-8")) + return [str(t).strip() for t in (data if isinstance(data, list) else []) if str(t).strip()] + except Exception: + return [] + + +def _save_vocabulary(terms: list[str]) -> None: + with VOCAB_LOCK: + DATA_DIR.mkdir(parents=True, exist_ok=True) + VOCAB_FILE.write_text(json.dumps(sorted(set(terms)), ensure_ascii=False, indent=2), encoding="utf-8") + + +def _transcribe_with_voxtral(audio_path: Path, cfg: dict) -> dict: + """Call the Voxtral transcription API (multipart) of the configured provider. + The language is auto-detected (no forced language); diarization + custom + vocabulary (context_bias) are enabled by default. The app's audio is + German/English, so auto-detection resolves to de/en.""" + base_parts: list = [("model", (None, cfg["model"]))] + if cfg["diarize"]: + base_parts.append(("diarize", (None, "true"))) + base_parts.append(("timestamp_granularities", (None, "segment"))) + for term in _load_vocabulary()[:100]: # custom vocabulary → context_bias + base_parts.append(("context_bias", (None, term))) + + def do_request(): + # Re-open the file on every attempt: a retried multipart POST needs a + # fresh handle, otherwise the body would be empty (handle at EOF). + with audio_path.open("rb") as f: + parts = base_parts + [("file", (audio_path.name, f, "application/octet-stream"))] + return requests.post( + cfg["url"], + headers={"Authorization": f"Bearer {_stt_api_key(cfg)}"}, + files=parts, + timeout=cfg["timeout"], + ) + + resp = retry.request_with_retry(do_request, label=f"{cfg['provider']}-stt") + if resp.status_code >= 400: + raise RuntimeError( + f"Transkription ({cfg['provider']}) HTTP {resp.status_code}: {resp.text[:500]}" + ) + return resp.json() + + +def _format_voxtral_transcript(result: dict) -> str: + # Speaker label follows the auto-detected language (de → SPRECHER, en → SPEAKER). + lang = normalize_language(result.get("language") or "de") + speaker_label = "SPEAKER" if lang == "en" else "SPRECHER" + empty_label = "No speech detected" if lang == "en" else "Keine Sprache erkannt" + + segments = result.get("segments") or [] + lines: list[str] = [] + last_speaker = object() # sentinel so the first segment never "merges" + for seg in segments: + text = (seg.get("text") or "").strip() + if not text: + continue + speaker = seg.get("speaker_id") + if lines and speaker == last_speaker: + lines[-1] += " " + text # merge consecutive same-speaker segments + continue + label = f"{speaker_label}_{speaker}" if speaker is not None else speaker_label + lines.append(f"{label}: {text}") + last_speaker = speaker + if lines: + return "\n".join(lines) + + full_text = (result.get("text") or "").strip() + if full_text: + return f"{speaker_label}: {full_text}" + return f"{speaker_label}: {empty_label}" + + +def _format_duration(seconds: float) -> str: + minutes = int(round(seconds / 60)) + return f"{minutes // 60}:{minutes % 60:02d} h" + + +def transcribe_audio(file_path: Path, duration_seconds: float = 0.0) -> str: + """Transcribe an audio/video file via Voxtral (auto language detection), + Provider laut Tenant-Konfiguration. Returns the speaker-labelled transcript. + + The request timeout grows with the audio length (STT_TIMEOUT + 5 min per + audio hour), so a long but valid recording is not cut off and retried.""" + cfg = _stt_config() + cfg["timeout"] += int(300 * duration_seconds / 3600) + audio_path, created = extract_audio_if_video(file_path) + try: + result = _transcribe_with_voxtral(audio_path, cfg) + return _format_voxtral_transcript(result) + except Exception as exc: + print(f"Transkriptionsfehler ({cfg['provider']}): {exc}") + raise + finally: + if created: + audio_path.unlink(missing_ok=True) + + +def _track_stt_usage(seconds: float, *, account: str | None = None, + idempotency_key: str | None = None) -> None: + """Report the EUR cost of an STT call from audio duration (billed per minute). + Best effort: tracking failures must never break the transcription flow.""" + try: + if seconds <= 0: + return + minutes = seconds / 60.0 + stt = _stt_config() + cost.track_usage( + "stt_audio", + amount_eur=cost.stt_cost_eur(minutes, per_minute=stt["cost_per_minute"]), + account=account, + quantity=round(minutes, 2), + idempotency_key=f"{idempotency_key}:stt" if idempotency_key else None, + metadata={"model": stt["model"], "provider": stt["provider"], + "seconds": round(seconds, 1)}, + ) + except Exception as exc: + print(f"[cost] stt usage tracking skipped: {exc}") + + +# ── transcript upload parsing (docx / vtt / txt) ───────────────────────────── + + +def _normalize_speaker_name(name: str) -> str: + """Canonical speaker label so the same person never splits into several. + + Word/Teams/Zoom exports frequently mix non-breaking spaces, double spaces + or trailing punctuation in the same name across utterances; without this + the dedup downstream would show "Ruben", "Ruben", "Ruben" as 3 speakers. + """ + name = re.sub(r"\s+", " ", name).strip() + return name.rstrip(":").strip() + + +def _extract_docx_text(content: bytes) -> str: + import zipfile + import xml.etree.ElementTree as ET + try: + with zipfile.ZipFile(io.BytesIO(content)) as zf: + xml_bytes = zf.read("word/document.xml") + except (zipfile.BadZipFile, KeyError) as exc: + raise HTTPException(status_code=415, detail=f"Ungültige .docx-Datei: {exc}") + ns = "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}" + root = ET.fromstring(xml_bytes) + paragraphs: list[str] = [] + for paragraph in root.iter(f"{ns}p"): + text = "".join((t.text or "") for t in paragraph.iter(f"{ns}t")) + paragraphs.append(text.strip()) + return "\n".join(paragraphs) + + +def _parse_vtt_transcript(raw: str) -> str: + lines = raw.replace("\r\n", "\n").split("\n") + output: list[str] = [] + current_speaker: str | None = None + current_text: list[str] = [] + tag_pattern = re.compile(r"<[^>]+>") + voice_pattern = re.compile(r"^]+)>(.*?)(?:)?\s*$", re.IGNORECASE) + cue_id_pattern = re.compile(r"^(\d+|[0-9a-f\-]{16,})$", re.IGNORECASE) + + def flush(): + nonlocal current_speaker, current_text + if current_text: + text = " ".join(current_text).strip() + if text: + output.append(f"{current_speaker or 'SPRECHER'}: {text}") + current_text = [] + current_speaker = None + + for line in lines: + stripped = line.strip() + if not stripped: + flush() + continue + if stripped.upper().startswith("WEBVTT") or stripped.startswith("NOTE"): + continue + if "-->" in stripped: + flush() + continue + if cue_id_pattern.match(stripped): + continue + match = voice_pattern.match(stripped) + if match: + current_speaker = _normalize_speaker_name(match.group(1)) + current_text.append(tag_pattern.sub("", match.group(2)).strip()) + else: + current_text.append(tag_pattern.sub("", stripped).strip()) + flush() + return "\n".join(line for line in output if line.strip()) + + +def _normalize_text_transcript(raw: str) -> str: + lines = raw.replace("\r\n", "\n").replace("\r", "\n").split("\n") + output: list[str] = [] + current_speaker: str | None = None + current_text: list[str] = [] + timestamp_pattern = re.compile(r"^(.+?)\s+\d{1,2}:\d{2}(?::\d{2})?(?:\.\d+)?\s*$") + # Teams/Zoom .docx export: "Name M:SS". + # The timestamp is followed immediately (no space) by the utterance, so the + # minute must not bleed into the speaker name (the "Olivia Kibele 0" bug). + teams_pattern = re.compile(r"^(.+?)\s+\d{1,2}:\d{2}(?::\d{2})?(\S.*)$") + inline_pattern = re.compile(r"^([^:\n]{1,80}):\s*(.+)$") + + def looks_like_name(candidate: str) -> bool: + return bool( + candidate + and len(candidate.split()) <= 6 + and not re.search(r"[.!?]", candidate) + and not candidate.lower().startswith("http") + ) + + def flush(): + nonlocal current_text + if current_speaker is not None and current_text: + text = " ".join(current_text).strip() + if text: + output.append(f"{current_speaker}: {text}") + current_text = [] + + for raw_line in lines: + line = raw_line.strip() + if not line: + flush() + continue + timestamp_match = timestamp_pattern.match(line) + if timestamp_match and not timestamp_match.group(1).lower().startswith("http"): + flush() + current_speaker = _normalize_speaker_name(timestamp_match.group(1)) + continue + teams_match = teams_pattern.match(line) + if teams_match and looks_like_name(teams_match.group(1).strip()): + flush() + current_speaker = _normalize_speaker_name(teams_match.group(1)) + current_text.append(teams_match.group(2).strip()) + continue + inline_match = inline_pattern.match(line) + if inline_match: + candidate = inline_match.group(1).strip() + if looks_like_name(candidate): + flush() + current_speaker = _normalize_speaker_name(candidate) + current_text.append(inline_match.group(2).strip()) + continue + if current_speaker is None: + current_speaker = "SPRECHER" + current_text.append(line) + flush() + # Drop the leading header block (title/date/duration/"Transkription gestartet") + # that precedes the first real speaker — but keep SPRECHER if the whole + # transcript is unlabelled (no named speaker was ever found). + if any(not line.startswith("SPRECHER:") for line in output): + while output and output[0].startswith("SPRECHER:"): + output.pop(0) + if not output and raw.strip(): + output.append(f"SPRECHER: {raw.strip()}") + return "\n".join(output) + + +def parse_transcript_upload(content: bytes, filename: str | None) -> str: + suffix = Path(filename or "").suffix.lower() + if suffix == ".docx": + text = _extract_docx_text(content) + else: + text = content.decode("utf-8", errors="replace") + if text.startswith(""): + text = text[1:] + if suffix == ".vtt": + return _parse_vtt_transcript(text) + return _normalize_text_transcript(text) + + +def _upload_suffix(content_type: str, filename: str | None) -> str: + ext_map = { + "audio/mpeg": ".mp3", "audio/mp3": ".mp3", "audio/webm": ".webm", "video/webm": ".webm", + "audio/ogg": ".ogg", "audio/wav": ".wav", "audio/flac": ".flac", "audio/x-flac": ".flac", + "audio/aac": ".aac", "audio/x-m4a": ".m4a", "audio/mp4": ".mp4", "video/mp4": ".mp4", + "video/quicktime": ".mov", "video/x-m4v": ".m4v", + } + # The filename comes from the client, so only a plain, short extension is + # carried over into the temp path — everything else falls back to the + # content type (ffmpeg/STT pick the decoder by extension). + guessed = Path(filename or "").suffix.strip().lower().lstrip(".") + if guessed.isalnum() and 1 <= len(guessed) <= 8: + return f".{guessed}" + return ext_map.get(content_type, ".audio") + + +async def _persist_upload_temporarily(file: UploadFile) -> tuple[Path, int]: + content_type = (file.content_type or "").split(";")[0].strip().lower() + suffix = Path(file.filename or "").suffix.lower() + supported_type = content_type in ALLOWED_CONTENT_TYPES or content_type.startswith("audio/") + supported_suffix = suffix in ALLOWED_UPLOAD_SUFFIXES + if not supported_type and not supported_suffix: + raise HTTPException( + status_code=415, + detail=_unsupported_format_detail("Dateiformat", suffix, ALLOWED_UPLOAD_SUFFIXES), + ) + content = await file.read() + if len(content) > MAX_FILE_SIZE: + max_mb = MAX_FILE_SIZE // 1024 // 1024 + raise HTTPException(status_code=413, detail=f"Datei zu groß ({len(content) // 1024 // 1024} MB). Max {max_mb} MB") + if len(content) == 0: + raise HTTPException(status_code=400, detail="Leere Datei") + temp_path = TEMP_DIR / f"{uuid.uuid4()}{_upload_suffix(content_type, file.filename)}" + temp_path.write_bytes(content) + return temp_path, len(content) + + +# ── AI summarisation ───────────────────────────────────────────────────────── + + +def _llm_client(): + try: + from openai import OpenAI + except ModuleNotFoundError as exc: + raise RuntimeError( + "Python-Paket 'openai' nicht installiert. Bitte Abhaengigkeiten neu installieren." + ) from exc + api_key = os.getenv("CORTECS_API_KEY", "").strip() + if not api_key: + raise RuntimeError("CORTECS_API_KEY nicht gesetzt") + # Cortecs speaks the OpenAI wire format; the SDK appends /chat/completions to + # the base URL, so it must include the /v1 prefix. + # The SDK retries connection errors + 408/409/429/5xx with exponential + # backoff; bump the default (2) so a brief provider blip doesn't fail the job. + return OpenAI( + api_key=api_key, + base_url=os.getenv("CORTECS_BASE_URL", "https://api.cortecs.ai/v1").strip(), + max_retries=int(os.getenv("LLM_MAX_RETRIES", "4")), + timeout=float(os.getenv("LLM_TIMEOUT", "600")), + ) + + +def _summary_prompt() -> str: + """The summary prompt with the tenant's identity filled in. + + The shared default prompt is written with @@ORG@@/@@ORG_SHORT@@/@@ORG_PROFILE@@ + placeholders so every tenant gets a protocol that names *its own* company — + a tenant-specific prompt.txt simply contains no placeholders. + """ + path = CFG.prompt_path + if not path.exists(): + raise RuntimeError(f"{path} nicht gefunden") + prompt = path.read_text(encoding="utf-8").strip() + if not prompt: + raise RuntimeError(f"{path} ist leer") + for token, value in ( + ("@@ORG@@", CFG.ai_detect_org), + ("@@ORG_SHORT@@", CFG.org_short), + ("@@ORG_PROFILE@@", CFG.org_profile), + ): + prompt = prompt.replace(token, value) + # An empty @@ORG_PROFILE@@ must not leave a dangling space behind. + return re.sub(r"[ \t]+(?=\n)", "", prompt).strip() + + +def _llm_text(response) -> str: + parts = [] + for choice in getattr(response, "choices", []) or []: + text = getattr(getattr(choice, "message", None), "content", None) + if text: + parts.append(text) + return "\n".join(parts).strip() + + +def _track_llm_usage(cost_point: str, model: str, response, *, account: str | None = None, + idempotency_key: str | None = None) -> None: + """Report the EUR cost of a Cortecs/Claude call from its token usage. + Best effort: tracking failures must never break the summarisation flow.""" + try: + usage = getattr(response, "usage", None) + if usage is None: + return + in_tok = int(getattr(usage, "prompt_tokens", 0) or 0) + out_tok = int(getattr(usage, "completion_tokens", 0) or 0) + cost.track_usage( + cost_point, + amount_eur=cost.llm_cost_eur(model, in_tok, out_tok), + account=account, + quantity=in_tok + out_tok, + idempotency_key=idempotency_key, + metadata={"model": model, "input_tokens": in_tok, "output_tokens": out_tok}, + ) + except Exception as exc: + print(f"[cost] llm usage tracking skipped: {exc}") + + +def _set_send_job(job_id: str, **updates): + with SEND_JOBS_LOCK: + job = SEND_JOBS.setdefault(job_id, {}) + job.update(updates) + + +def _set_summarize_job(job_id: str, **updates): + with SUMMARIZE_JOBS_LOCK: + SUMMARIZE_JOBS.setdefault(job_id, {}).update(updates) + + +def _prune_summarize_jobs(keep: int = 50): + with SUMMARIZE_JOBS_LOCK: + overflow = len(SUMMARIZE_JOBS) - keep + if overflow <= 0: + return + stale = [ + jid for jid, d in SUMMARIZE_JOBS.items() + if d.get("status") in ("completed", "error") + ][:overflow] + for jid in stale: + SUMMARIZE_JOBS.pop(jid, None) + + +def _run_summarize_job(job_id: str, transcript: str, title: str, insurance_type: str, + customer_2: str, customer_name: str, customer_address: str, + account: str | None = None): + started = time.monotonic() + try: + _set_summarize_job(job_id, status="running") + print(f"[summarize {job_id}] Start") + summary = summarize_with_ai( + transcript, title, insurance_type, customer_2, customer_name, customer_address, + account=account, idempotency_key=job_id, + ) + _set_summarize_job(job_id, status="completed", summary=summary, + completed_at=datetime.now().isoformat()) + print(f"[summarize {job_id}] Fertig nach {time.monotonic() - started:.1f}s") + except Exception as exc: + _set_summarize_job(job_id, status="error", error=str(exc), + completed_at=datetime.now().isoformat()) + print(f"[summarize {job_id}] Fehlgeschlagen nach {time.monotonic() - started:.1f}s: {exc}") + + +def _set_transcribe_job(job_id: str, **updates): + with TRANSCRIBE_JOBS_LOCK: + TRANSCRIBE_JOBS.setdefault(job_id, {}).update(updates) + + +def _prune_transcribe_jobs(keep: int = 50): + # Finished/failed jobs hold the full transcript, so cap how many we retain + # to avoid unbounded memory growth on a long-running process. + with TRANSCRIBE_JOBS_LOCK: + overflow = len(TRANSCRIBE_JOBS) - keep + if overflow <= 0: + return + stale = [ + jid for jid, d in TRANSCRIBE_JOBS.items() + if d.get("status") in ("completed", "error") + ][:overflow] + for jid in stale: + TRANSCRIBE_JOBS.pop(jid, None) + + +def _run_transcribe_job(job_id: str, temp_paths: list[Path], filename: str, size: int, + account: str | None = None): + started = time.monotonic() + merged: Path | None = None + try: + _set_transcribe_job(job_id, status="running") + print(f"[transcribe {job_id}] Start ({filename}, {len(temp_paths)} Datei(en), {size} Bytes)") + if len(temp_paths) > 1: + merged = concat_audio(temp_paths) + temp_path = merged or temp_paths[0] + seconds = _audio_duration_seconds(temp_path) + # 0.0 = ffprobe could not read the duration → let the provider decide. + if seconds > MAX_AUDIO_SECONDS: + raise AudioTooLongError( + f"Die Aufnahme ist insgesamt {_format_duration(seconds)} lang – möglich sind " + f"höchstens {_format_duration(MAX_AUDIO_SECONDS)} pro Transkription. " + "Bitte kürzen oder auf mehrere Protokolle aufteilen." + ) + transcript = transcribe_audio(temp_path, seconds) + _track_stt_usage(seconds, account=account, idempotency_key=job_id) + _set_transcribe_job( + job_id, status="completed", transcription=transcript, + filename=filename, size=size, completed_at=datetime.now().isoformat(), + ) + print(f"[transcribe {job_id}] Fertig nach {time.monotonic() - started:.1f}s") + except NoSpeechDetectedError as exc: + _set_transcribe_job(job_id, status="error", error=str(exc), + completed_at=datetime.now().isoformat()) + print(f"[transcribe {job_id}] Keine Sprache erkannt nach {time.monotonic() - started:.1f}s") + except AudioTooLongError as exc: + _set_transcribe_job(job_id, status="error", error=str(exc), + completed_at=datetime.now().isoformat()) + print(f"[transcribe {job_id}] Zu lang ({exc})") + except Exception as exc: + _set_transcribe_job( + job_id, status="error", + error=f"Transkription fehlgeschlagen: {exc}", + completed_at=datetime.now().isoformat(), + ) + print(f"[transcribe {job_id}] Fehlgeschlagen nach {time.monotonic() - started:.1f}s: {exc}") + finally: + for p in (*temp_paths, merged): + if p is not None: + p.unlink(missing_ok=True) + + +def summarize_with_ai( + transcript: str, title: str, insurance_type: str = "", customer_2: str = "", + customer_name: str = "", customer_address: str = "", + account: str | None = None, idempotency_key: str | None = None, +) -> str: + client = _llm_client() + base_prompt = _summary_prompt() + ctx = { + "title": title, "insurance_type": insurance_type, "customer_2": customer_2, + "customer_name": customer_name, "customer_address": customer_address, + } + prompt = HOOKS.build_prompt(base_prompt, ctx) + model = os.getenv("LLM_MODEL", "claude-4-6-sonnet") + + terminart_val = insurance_type.strip() or "(aus Gespräch erkennen)" + projekt_val = customer_2.strip() or "(keiner)" + kunde_val = customer_name.strip() or "(aus Gespräch erkennen)" + kontakt_val = customer_address.strip() or "(aus Gespräch erkennen)" + title_val = title.strip() or "(ohne Titel)" + + user_content = ( + f"Termin-Art: {terminart_val}\n" + f"Projektname: {projekt_val}\n" + f"Kunde / Unternehmen: {kunde_val}\n" + f"Ansprechpartner Kunde: {kontakt_val}\n" + f"Meeting-Titel: {title_val}\n\n" + f"Gesprächsprotokoll:\n{transcript}" + ) + def complete(system_prompt: str, cost_suffix: str): + response = client.chat.completions.create( + model=model, + messages=[ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_content}, + ], + max_tokens=int(os.getenv("LLM_MAX_TOKENS", "16000")), + temperature=float(os.getenv("LLM_TEMPERATURE", "0.2")), + stream=False, + ) + _track_llm_usage("llm_summarize", model, response, account=account, + idempotency_key=f"{idempotency_key}:{cost_suffix}" if idempotency_key else None) + return _llm_text(response), _hit_token_limit(response) + + content, truncated = complete(prompt, "summarize") + if truncated: + # The protocol ran into max_tokens and stops mid-sentence. Instead of + # an error, silently ask once more for a shorter version that keeps + # the tenant's structure (the tenant prompt itself stays unchanged). + print(f"[summarize] max_tokens erreicht ({len(content)} Zeichen) – zweiter Versuch, gekürzt") + content, truncated = complete(prompt + _SHORTER_RETRY_INSTRUCTION, "summarize-short") + if truncated: + print("[summarize] auch der gekürzte Versuch hat max_tokens erreicht") + content = _drop_unfinished_tail(content) + if not content: + raise RuntimeError("Claude hat keine Dokumentation zurückgegeben") + return normalize_protocol_text(content) + + +_SHORTER_RETRY_INSTRUCTION = """ + +Wichtiger Zusatz zur Länge: +Ein erster Versuch mit diesen Anweisungen ist zu lang geworden und wurde abgeschnitten. Erstelle das Dokument deshalb in einer deutlich kürzeren Fassung, etwa halb so lang wie üblich. +- Behalte den Aufbau exakt bei: dieselben Metadatenblöcke, dieselben Abschnitte und Überschriften in derselben Reihenfolge, dieselben Formatregeln und dieselbe Tonalität. +- Kein Abschnitt darf fehlen, auch die letzten Abschnitte müssen vollständig sein. +- Kürze durch Verdichten: weniger Details, Beispiele und Nebenaspekte, kürzere Absätze, weniger Zwischenüberschriften. Zahlen, Termine, Namen und Entscheidungen bleiben erhalten. +- Alle übrigen Regeln, insbesondere "erfinde nichts", gelten unverändert.""" + + +def _hit_token_limit(response) -> bool: + """True if the model stopped because max_tokens was reached (the text is + then cut off mid-sentence). OpenAI-compatible: finish_reason "length".""" + for choice in getattr(response, "choices", []) or []: + if getattr(choice, "finish_reason", None) in ("length", "max_tokens"): + return True + return False + + +def _drop_unfinished_tail(text: str) -> str: + """Last resort for a still truncated protocol: drop the half-written last + line, which the PDF parser would otherwise render as a heading, and any + heading left without content above it.""" + lines = text.rstrip().split("\n") + unfinished = lambda ln: not re.search(r"[.!?:…\"“”»)\]]$", ln.strip()) + if len(lines) > 1 and unfinished(lines[-1]): + lines.pop() + while len(lines) > 1 and (not lines[-1].strip() or unfinished(lines[-1])): + lines.pop() + return "\n".join(lines).rstrip() + + +# ── e-mail / delivery ──────────────────────────────────────────────────────── + + +def build_email_html(title: str, summary: str) -> str: + escaped_title = html.escape(title) + c = CFG.colors + org = CFG.office.get("name", CFG.name) + subtitle = CFG.office.get("subtitle", "") + org_line = f"{org} {subtitle}".strip() + return f"""\ + + + +

+ + +""" + + +def build_pdf( + title: str, summary: str, transcript: str, insurance_type: str = "", customer_2: str = "", + customer_name: str = "", customer_address: str = "", +) -> bytes: + context = build_pdf_context( + CFG, title, summary, insurance_type, customer_2, customer_name, customer_address + ) + context = HOOKS.pdf_context(context) + return render_pdf(context, CFG) + + +def build_docx( + title: str, summary: str, transcript: str, insurance_type: str = "", customer_2: str = "", + customer_name: str = "", customer_address: str = "", +) -> bytes: + # Reuses the exact same structured context as the PDF, so the Word document + # carries identical content for every tenant. + context = build_pdf_context( + CFG, title, summary, insurance_type, customer_2, customer_name, customer_address + ) + context = HOOKS.pdf_context(context) + return render_docx(context, CFG) + + +def deliver( + recipients: list[str], title: str, summary: str, transcript: str, insurance_type: str = "", + customer_2: str = "", customer_name: str = "", customer_address: str = "", +) -> bool: + clean_summary = normalize_protocol_text(summary) + pdf_bytes = build_pdf(title, clean_summary, transcript, insurance_type, customer_2, customer_name, customer_address) + + parsed = parse_protocol_sections(clean_summary) + projekt_lines = parsed["projekt"] + if customer_name.strip(): + projekt_lines = [customer_name.strip()] + ([customer_2.strip()] if customer_2.strip() else []) + project_lbl = project_label(projekt_lines) if projekt_lines else "Projekt" + terminart = insurance_type.strip() or parsed["terminart"] or "Kundengespräch" + date_str = datetime.now().strftime("%Y-%m-%d") + pdf_name = f"{date_str}_{safe_filename(terminart)}_{safe_filename(project_lbl)}.pdf" + subject_title = f"Gesprächsprotokoll {terminart} – {project_lbl}" + + smtp_host = os.getenv("SMTP_HOST") + smtp_port = int(os.getenv("SMTP_PORT", 587)) + smtp_user = os.getenv("SMTP_USER") + smtp_password = os.getenv("SMTP_PASSWORD") + smtp_from_raw = os.getenv("SMTP_FROM", "").strip() + if smtp_from_raw and "@" not in smtp_from_raw and smtp_user: + smtp_from = f"{smtp_from_raw} <{smtp_user}>" + elif smtp_from_raw: + smtp_from = smtp_from_raw + else: + smtp_from = smtp_user or "" + + if not all([smtp_host, smtp_user, smtp_password]): + raise RuntimeError("SMTP nicht konfiguriert. Das PDF wurde nicht gespeichert und nicht versendet.") + + html_body = build_email_html(subject_title, clean_summary) + body = ( + f"Termin-Art: {terminart}\n" + f"Projekt: {project_lbl}\n" + f"Datum: {datetime.now().strftime('%d.%m.%Y')}\n\n" + f"Im Anhang finden Sie das Gesprächsprotokoll als PDF." + ) + msg = MIMEMultipart("mixed") + msg["Subject"] = subject_title + msg["From"] = smtp_from + msg["To"] = ", ".join(recipients) + alt = MIMEMultipart("alternative") + alt.attach(MIMEText(body, "plain", "utf-8")) + alt.attach(MIMEText(html_body, "html", "utf-8")) + msg.attach(alt) + attachment = MIMEApplication(pdf_bytes, _subtype="pdf") + attachment.add_header("Content-Disposition", "attachment", filename=pdf_name) + msg.attach(attachment) + + print(f"Sende E-Mail an {recipients} via {smtp_host}:{smtp_port} ...") + + def _send(): + with smtplib.SMTP(str(smtp_host), smtp_port, timeout=30) as server: + server.ehlo() + server.starttls() + server.ehlo() + auth_str = f"\x00{smtp_user}\x00{smtp_password}" + auth_b64 = base64.b64encode(auth_str.encode("utf-8")).decode("ascii") + code, resp = server.docmd("AUTH PLAIN", auth_b64) + if code != 235: + raise smtplib.SMTPAuthenticationError(code, resp) + server.send_message(msg, from_addr=str(smtp_from), to_addrs=recipients) + + try: + # Retry only transient connection failures (OSError covers connection + # reset / timeout / DNS). Auth and recipient errors are not OSError, so + # they fail fast without pointless retries. + retry.call_with_retry( + _send, + retry_on=(smtplib.SMTPConnectError, smtplib.SMTPServerDisconnected, OSError), + label="smtp-send", + ) + print("E-Mail erfolgreich gesendet.") + except Exception as e: + print(f"SMTP-Fehler: {e}") + raise RuntimeError(f"E-Mail konnte nicht gesendet werden: {e}") from e + return True + + +# ── frontend templating ────────────────────────────────────────────────────── + + +def _favicon_data_uri() -> str: + # A tenant can ship its own brand favicon (favicon.svg). Otherwise we + # generate a compact mark from the tenant's accent + red colours. + fav = CFG.favicon_path + if fav: + svg = re.sub(r"<\?xml.*?\?>", "", fav.read_text(encoding="utf-8"), flags=re.DOTALL).strip() + return "data:image/svg+xml," + quote(svg, safe="") + c = CFG.colors + accent = c["accent"].replace("#", "%23") + red = c["red"].replace("#", "%23") + return ( + "data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'%3E" + "%3Crect width='64' height='64' rx='14' fill='%23FFFFFF'/%3E" + f"%3Ccircle cx='39' cy='15' r='6.5' fill='{accent}'/%3E" + f"%3Cpath d='M17 23 L30 35 L17 47' fill='none' stroke='{accent}' stroke-width='6.5' stroke-linecap='round' stroke-linejoin='round'/%3E" + f"%3Cpath d='M31 29 L44 41 L31 53' fill='none' stroke='{red}' stroke-width='6.5' stroke-linecap='round' stroke-linejoin='round'/%3E" + "%3C/svg%3E" + ) + + +def _topbar_logo_markup() -> str: + p = CFG.logo_path + label = html.escape(CFG.name) + if p and p.suffix.lower() == ".svg": + svg = p.read_text(encoding="utf-8") + svg = re.sub(r"<\?xml.*?\?>", "", svg, flags=re.DOTALL) + svg = re.sub(r"", "", svg, flags=re.DOTALL) + svg = re.sub(r" +
+ + + + +
+ + +
+
+ +
+ +
+ +
+ +
+
Hierher ziehen oder Datei auswählen
+
MP3 · WAV · WebM · OGG · FLAC · MP4
+ +
+ + +
+ +
oder
+ +
+
+ + +
Aufnahme starten
+
+ + +
+ +
+
+ +
oder
+ +
+ +
+ +
+ +
+
Bereits ein Transkript? Datei auswählen
+
TXT · VTT · DOCX (Teams-Export)
+ +
+
+ +
+ +
+ + + +
+
+
+ + + +
+ Audiodatei senden + +
+
+
+
+ + + +
+ Spracherkennung läuft + +
+
+
+
+ + + +
+ Transkript aufbereiten + +
+
+
+ +
+
+ + +
+
+ +
+ +
+
+
Sprecher
+
+
+
+
+ + +
+
+
+ +
+
+
Transkript
+ Text anklicken zum Bearbeiten +
+
+
+
+
+ +
+ + + +
+
+ + +
+
+ +
+
Protokoll prüfen & freigeben
+
Direkt editierbar — Änderungen werden beim Senden übernommen
+
+ + + +
+
+ + + +
+
+ An: + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + diff --git a/vendor/platform/core/templates/protocol.css b/vendor/platform/core/templates/protocol.css new file mode 100644 index 0000000..e12cdb5 --- /dev/null +++ b/vendor/platform/core/templates/protocol.css @@ -0,0 +1,112 @@ +/* Default PDF stylesheet. Rendered through Jinja, so colour tokens like + colors.accent (in double curly braces) from the tenant config are available. + Copy this file into a tenant folder and edit freely to give a customer a + completely individual PDF design. */ + +@page { + size: A4; + margin: 26mm 22mm 24mm 22mm; + + @top-left { + content: element(runHdrText); + vertical-align: bottom; + } + @top-right { + content: element(runHdrLogo); + vertical-align: bottom; + } + @bottom-left { + content: element(runFtr); + vertical-align: top; + } + @bottom-right { + content: "Seite " counter(page, decimal-leading-zero) " / " counter(pages, decimal-leading-zero); + vertical-align: top; + font-size: 7.5pt; + font-style: italic; + color: {{ colors.text_3 }}; + } +} + +body { + font-family: "Noto Sans", "DejaVu Sans", Arial, sans-serif; + font-size: 9.8pt; + color: #000000; + margin: 0; +} + +/* ── running header / footer ── */ +.run-hdr-text { + position: running(runHdrText); + font-style: italic; + font-size: 9pt; + color: {{ colors.text_2 }}; +} +.run-hdr-logo { + position: running(runHdrLogo); + height: 12mm; +} +.run-ftr { + position: running(runFtr); + font-size: 7pt; + line-height: 1.4; + color: {{ colors.text_2 }}; +} + +/* ── optional document title (tenant sets doc_title) ── */ +.doc-title { + color: {{ colors.accent_dark }}; + font-size: 16pt; + font-weight: 700; + margin: 0 0 3mm 0; +} + +/* ── metadata block ── */ +.meta { + width: 100%; + border-collapse: collapse; + margin: 2mm 0 6mm 0; +} +.meta-left { width: 50%; vertical-align: top; padding: 0; } +.meta-right { width: 50%; vertical-align: top; text-align: right; padding: 0; } +.meta-label { + color: {{ colors.accent }}; + font-style: italic; + font-size: 11pt; + margin-bottom: 1.8mm; +} +.meta-sublabel { + color: {{ colors.accent }}; + font-weight: 700; + font-size: 9.5pt; + margin: 3mm 0 1mm 0; +} +.meta-val { + font-size: 10.2pt; + line-height: 1.45; +} + +/* ── content sections ── */ +.proto-section { margin-bottom: 3.5mm; } +.section-bar { + background: {{ colors.accent_light }}; + color: {{ colors.accent_dark }}; + font-size: 10pt; + font-weight: 700; + padding: 1.8mm 2.5mm; + margin: 0 0 2.5mm 0; + break-after: avoid; +} +.para { + margin: 0 0 1.8mm 6mm; + line-height: 1.5; +} +.bullets { + margin: 0 0 1.8mm 0; + padding-left: 10mm; + list-style: disc; +} +.bullets li { + margin: 0 0 0.8mm 0; + line-height: 1.5; +} diff --git a/vendor/platform/core/templates/protocol.html b/vendor/platform/core/templates/protocol.html new file mode 100644 index 0000000..b9d7c53 --- /dev/null +++ b/vendor/platform/core/templates/protocol.html @@ -0,0 +1,59 @@ + + + + + Gesprächsprotokoll {{ terminart }} – {{ project_display }} + + + + {# ── running header/footer: pulled into the @page margin boxes by the CSS ── #} +
{{ terminart }}  |  Gesprächsprotokoll
+ {% if logo_data_uri %}{% endif %} +
+
Gesprächsprotokoll · {{ terminart }} · {{ date_de }} · {{ project_display }}
+
Erstellt durch: {{ office.name }}{% if office.subtitle %} {{ office.subtitle }}{% endif %}{% if office.tel %} • {{ office.tel }}{% endif %}{% if office.email %} • {{ office.email }}{% endif %}
+
{{ footer_note }}
+
+ + {% if doc_title %}

{{ doc_title }}

{% endif %} + + {# ── metadata: two columns (Projekt / Erstellt durch) ── #} + + + + + +
+
{{ projekt_label }}
+ {% for line in projekt %}
{{ line }}
{% endfor %} + {% if kontakt %} +
Ansprechpartner Kunde
+ {% for line in kontakt %}
{{ line }}
{% endfor %} + {% endif %} +
+
Erstellt durch
+ {% if office.name %}
{{ office.name }}{% if office.subtitle %} {{ office.subtitle }}{% endif %}
{% endif %} + {% for line in (office.address or "").splitlines() %}
{{ line }}
{% endfor %} + {% if office.tel %}
{{ office.tel }}
{% endif %} + {% if office.email %}
{{ office.email }}
{% endif %} + {% if office.website %}
{{ office.website }}
{% endif %} +
+ + {# ── content sections ── #} + {% for section in sections %} +
+

{{ section.heading }}

+ {% for block in section.blocks %} + {% if block.type == 'paragraph' %} +

{{ block.text }}

+ {% elif block.type == 'list' %} +
    + {% for item in block['items'] %}
  • {{ item }}
  • {% endfor %} +
+ {% endif %} + {% endfor %} +
+ {% endfor %} + + + diff --git a/vendor/platform/main.py b/vendor/platform/main.py new file mode 100644 index 0000000..50ed9c4 --- /dev/null +++ b/vendor/platform/main.py @@ -0,0 +1,12 @@ +"""Entry point. The tenant is selected via the TENANT env var (one instance +per customer). Run e.g.: + + TENANT=sportklinik python main.py +""" +import os + +import uvicorn + +if __name__ == "__main__": + port = int(os.getenv("PORT", "8276")) + uvicorn.run("core.app:app", host="0.0.0.0", port=port, reload=True) diff --git a/vendor/platform/requirements.txt b/vendor/platform/requirements.txt new file mode 100644 index 0000000..80ca5d0 --- /dev/null +++ b/vendor/platform/requirements.txt @@ -0,0 +1,13 @@ +# System-Abhängigkeiten: +# ffmpeg (Audio-Konvertierung; nur für Azure-STT nötig) +# libpango / libcairo etc. (WeasyPrint PDF-Rendering) +# Debian/Ubuntu: apt-get install ffmpeg libpango-1.0-0 libpangoft2-1.0-0 fonts-noto-core +fastapi==0.135.1 +openai==2.46.0 +python-multipart==0.0.22 +uvicorn==0.41.0 +python-dotenv==1.2.2 +requests>=2.31.0 +jinja2>=3.1.0 +weasyprint>=60.0 +python-docx>=1.1.0