From ef83e58a851bce0093bfff8e524f9d3666031625 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Mon, 11 May 2026 18:41:56 +0200
Subject: [PATCH] upd
---
README.md | 3 +-
TOPICS.md | 5 ++-
b-reference/frontend-nyla/architecture.md | 9 +++--
b-reference/gateway/ai-agent.md | 6 +--
b-reference/gateway/architecture.md | 11 +++++-
b-reference/gateway/voice-google.md | 44 ++++++++++++++++++++++
b-reference/teams-bot/architecture.md | 27 +++++++++++--
c-work/1-plan/stt-chirp-v2-evaluation.md | 22 +++++++++++
c-work/_CHANGELOG.md | 8 ++++
d-guides/deployment/poweron-sec.kdbx | Bin 23806 -> 23150 bytes
10 files changed, 120 insertions(+), 15 deletions(-)
create mode 100644 b-reference/gateway/voice-google.md
create mode 100644 c-work/1-plan/stt-chirp-v2-evaluation.md
diff --git a/README.md b/README.md
index cf024c9..955c7a7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,5 @@
-
+
# PowerOn PORTA -- Dokumentation
@@ -59,6 +59,7 @@ b-reference/
│ ├── workflow.md Workflow-Engine, Methoden, Aktionen
│ ├── automation.md Automation v1 + v2
│ ├── billing.md Billing, Subscriptions
+│ ├── voice-google.md Google STT/TTS (VoiceObjects, Streaming-WS, Feature-Mapping)
│ └── features/ trustee.md, commcoach.md, chatbot.md, ...
├── frontend-nyla/ Frontend-Komponente
│ └── architecture.md Seiten, Komponenten, Hooks, Routing
diff --git a/TOPICS.md b/TOPICS.md
index f34941b..a1b5f03 100644
--- a/TOPICS.md
+++ b/TOPICS.md
@@ -1,5 +1,5 @@
-
+
# Themen-Index für AI-Kontext
@@ -24,10 +24,11 @@ Lade immer zuerst diese Datei. Dann gezielt die passende(n) Referenz-Datei(en).
| Workflow-Engine | b-reference/gateway/workflow.md | Methoden, Aktionen, WorkflowManager |
| Automation | b-reference/gateway/automation.md | Graphical Editor, Scheduler, System-Automatisierung (`/automations`, `/api/system/workflow-runs/*`) |
| Billing & Subscriptions | b-reference/gateway/billing.md | Abrechnung, Prepaid, State Machine |
+| Google Voice (STT/TTS) | b-reference/gateway/voice-google.md | VoiceObjects, ConnectorGoogleSpeech, `/voice-google/stt/*`, CommCoach vs Teamsbot vs Agent |
| Frontend Nyla | b-reference/frontend-nyla/architecture.md | UI-Seiten, Komponenten, Hooks, Routing |
| FormGenerator (Table, Form, Tree, Report) | b-reference/frontend-nyla/formgenerator.md | Generische UI-Komponenten, Provider-Pattern, API-Anbindung |
| Private LLM | b-reference/private-llm/architecture.md | Internes LLM, Neutralisierung |
-| Teams Bot | b-reference/teams-bot/architecture.md | Meeting-Bot, WebSocket, Director Prompts (Hybrid Agent-Routing) |
+| Teams Bot | b-reference/teams-bot/architecture.md | Meeting-Bot, Browser-Bot WebSocket, Director Prompts (Hybrid Agent-Routing), MeetingModule + 5-Tab-UI, Dashboard-SSE, Live-Session-SSE + MFA |
## Cross-Cutting (repo-übergreifend)
diff --git a/b-reference/frontend-nyla/architecture.md b/b-reference/frontend-nyla/architecture.md
index 3575ab3..583c96e 100644
--- a/b-reference/frontend-nyla/architecture.md
+++ b/b-reference/frontend-nyla/architecture.md
@@ -1,6 +1,6 @@
-
-
+
+
# Frontend Nyla -- Architektur
@@ -16,7 +16,7 @@ Technologie-Stack (Stand UI-Doku): React 19.x, Vite 5.x, TypeScript 5.8.x, React
|--------|--------|
| `pages/` | Seiten: `admin/`, `basedata/`, `billing/`, `settings/`, `views/` (workspace, commcoach, chatbot, trustee, graphicalEditor, realestate, neutralization, teamsbot) |
| `components/` | Wiederverwendbar: FormGenerator (Table, Form, Tree, List, Report), Navigation, UnifiedDataBar, FlowEditor (Graphical Editor), OnboardingAssistant |
-| `hooks/` | useApiRequest (useApi.ts), useFiles, useNavigation, useConfirm, usePrompt, useResizablePanels, etc. |
+| `hooks/` | useApiRequest (useApi.ts), useFiles, useNavigation, useConfirm, usePrompt, useResizablePanels, `useSpeechAudioCapture` (`useVoiceStream`: Mic + WebSocket `/voice-google/stt/stream`, optionale STT-`open`-Parameter), etc. |
| `contexts/` | FileContext, PekContext, ToastContext, WorkflowSelectionContext |
| `api/` | API-Client (`api.ts`) und Feature-spezifische API-Module |
| `core/` | PageManager |
@@ -43,6 +43,7 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a
| `TemplatePicker` | Modal zur Auswahl von Workflow-Vorlagen beim Erstellen neuer Workflows |
| `WorkspacePage` | AI-Workspace mit Chat, UDB, Agent-Streaming |
| `TrusteeDataTablesView` | Konsolidierte Daten-Tabellen-Seite (Treuhand): 13 Tabs (Stammdaten, Lokale Daten, Konfiguration, Buchhaltungs-Daten) ueber generischen `TrusteeDataTab`-Wrapper, Lazy-Mount pro Tab, URL-State `?tab=`, read-only fuer Sync-Tabellen |
+| Teams Bot Views (`pages/views/teamsbot/`) | Dashboard (KPI + SSE), Assistent (Wizard), Module (CRUD + `?moduleId`), Live-Session (SSE + MFA), Settings — API `api/teamsbotApi.ts`; Architektur [teams-bot/architecture.md](../teams-bot/architecture.md) |
## Routing
@@ -50,6 +51,7 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a
- **Geschützte Bereiche:** Route-Guards (z. B. `ProtectedRoute`) prüfen Authentifizierung; Redirect bei fehlender Session.
- **Haupt-App:** Nach Login **`MainLayout.tsx`** mit **`MandateNavigation`** (Sidebar) und `` (React Router).
- **Seiten-Mapping:** `pageRegistry.tsx` definiert `PAGE_REGISTRY` und `FEATURE_REGISTRY`; Seiten werden lazy geladen. `core/PageManager/` enthält ergänzende Infrastruktur (State Preservation, Lifecycle-Hooks).
+- **Teams Bot:** `pages/views/teamsbot/` — fünf Tabs (Dashboard, Assistent, Module, Live-Session, Einstellungen). Dashboard: `teamsbotApi.createDashboardStream` (SSE). Live-Session: `createSessionStream`. Module-Liste: URL `?moduleId=` klappt ein Modul auf. Detail: [teams-bot/architecture.md](../teams-bot/architecture.md).
- **i18n:** DB-backed via `LanguageContext` (`t()`-Hook). Sprachsets werden dynamisch via public API geladen (`GET /api/i18n/sets/{code}`). Key-Konvention: **Deutscher Klartext = Key**. Jeder neue/geaenderte UI-Text MUSS mit `t('Deutscher Klartext')` getaggt werden. **`t()` darf NUR String-Literale enthalten** — `t(variable)` ist verboten. Werte vom Backend (Labels, Descriptions) sind bereits uebersetzt und werden direkt gerendert. Variable Interpolation: `t('Text {var}', {var: 'Wert'})`. Fallback: Ziel-Set → `de`-Set → `[key]` (eckige Klammern machen fehlende Uebersetzungen sichtbar). Keine statischen Locale-Files. Fuer statische Frontend-Maps (z.B. Wochentage, Monatsnamen, Status-Labels) wird `t()` per `switch`/Funktion mit Literalen aufgerufen, nicht ueber Map-Lookup.
- **TextMultilingual:** Felder vom Typ `TextMultilingual` rendern dynamisch Eingabefelder fuer alle verfuegbaren Sprachen (aus `availableLanguages`). `xx` ist das Pflichtfeld (Quelltext). Keine hardcodierten Sprach-Codes. Sprachcodes folgen ISO 639-1 (en, de, fr, it, …).
- **Theme:** global über Context; API-Requests mit Auth-Header (Interceptor in zentralem API-Client).
@@ -68,6 +70,7 @@ Ergänzend typische Root-Dateien und Bereiche im Repo: `main.tsx`, `App.tsx`, `a
| `main.tsx` | Application Entry Point |
| `App.tsx` | Root-Komponente, Router-Setup, Provider |
| `api.ts` (Root) | Axios-Instanz, Base URL, Token-Interceptor, 401-Handling |
+| `hooks/useSpeechAudioCapture.ts` | `useVoiceStream`: STT-Streaming; `start(language, sttOpenOptions?)`; CommCoach setzt `model`/`lightweight`/`singleUtterance`, Workspace nutzt Defaults |
| `layouts/MainLayout.tsx` | Haupt-Shell mit MandateNavigation + Outlet |
| `config/pageRegistry.tsx` | PAGE_REGISTRY, FEATURE_REGISTRY, Lazy Imports |
| `core/PageManager/` | State Preservation, Lifecycle, Caching |
diff --git a/b-reference/gateway/ai-agent.md b/b-reference/gateway/ai-agent.md
index 76bfe89..633ed82 100644
--- a/b-reference/gateway/ai-agent.md
+++ b/b-reference/gateway/ai-agent.md
@@ -1,6 +1,6 @@
-
-
+
+
# AI Agent & Knowledge Store
@@ -143,7 +143,7 @@ Zusätzlich zu den unten genannten **Kern-Tools** existieren **dynamische Tools*
| `readUrl` | Inhalt einer bekannten URL laden |
| `translateText` | Übersetzung (Voice/Translation-Pipeline) |
| `textToSpeech` | TTS |
-| `speechToText` | Transkription Audio-Datei |
+| `speechToText` | Transkription Audio-Datei (Gateway: `VoiceObjects.speechToText`; optionale Connector-Parameter `model`/`lightweight`/`audioFormat` — Agent-Tool nutzt Defaults) |
| `detectLanguage` | Spracherkennung für Text |
**Externe Datenquellen / Mail**
diff --git a/b-reference/gateway/architecture.md b/b-reference/gateway/architecture.md
index 06b8707..6132c85 100644
--- a/b-reference/gateway/architecture.md
+++ b/b-reference/gateway/architecture.md
@@ -1,6 +1,6 @@
-
-
+
+
# Gateway -- Architektur
@@ -99,6 +99,13 @@ Weitere Interface-Dateien im Ordner (z. B. Voice, Tickets, Messaging, Bootstrap)
| `gateway/modules/workflows/automation2/executionEngine.py` | Graph-Execution-Engine: topoSort, Transit-Routing, `_normalizeToSchema` nach Execute, `flow.merge`-Wait, Resume-Schema-Validierung |
| `gateway/modules/workflows/scheduler/mainScheduler.py` | Konsolidierter Workflow-Scheduler |
| `gateway/modules/interfaces/interfaceBootstrap.py` | System-Bootstrap (Templates, Billing, Stripe) |
+| `gateway/modules/interfaces/interfaceVoiceObjects.py` | Fassade Google STT/TTS, Billing-Callback Streaming |
+| `gateway/modules/connectors/connectorVoiceGoogle.py` | Google Speech v1 + Translation + TTS-Client |
+| `gateway/modules/routes/routeVoiceGoogle.py` | `/voice-google/*` inkl. STT-Streaming-WebSocket |
+
+## Google Voice (STT / TTS)
+
+Siehe Kanon-Seite **[voice-google.md](voice-google.md)** (Batch- vs Streaming-Pfad, WS-Protokoll `open`/`end_of_single_utterance`, Parameter `model` / `lightweight` / `audioFormat`, Zuordnung CommCoach / Teamsbot / Workspace / Agent-Tools).
## i18n (Mehrsprachigkeit)
diff --git a/b-reference/gateway/voice-google.md b/b-reference/gateway/voice-google.md
new file mode 100644
index 0000000..645ad4f
--- /dev/null
+++ b/b-reference/gateway/voice-google.md
@@ -0,0 +1,44 @@
+
+
+
+
+# Google Voice (STT / TTS)
+
+Zentrale Sprach-Pipeline im Gateway: **Google Cloud Speech-to-Text (v1)** und **Text-to-Speech** über die Fassade `VoiceObjects` (`interfaceVoiceObjects.py`) und den Connector `ConnectorGoogleSpeech` (`connectorVoiceGoogle.py`). Kein direkter Feature-Code soll den Connector umgehen; Billing-Hooks hängen an der Interface-Schicht (u. a. Streaming-STT bei finalen Segmenten).
+
+## Batch-Erkennung (`speechToText`)
+
+- **API:** `SpeechClient.recognize` (ein Request pro Audioclip).
+- **Parameter (optional, abwaertskompatibel):**
+ - **`model`:** z. B. `latest_long` (Default), `latest_short`.
+ - **`lightweight`:** `True` schaltet u. a. ab: Word-Timestamps, Word-Confidence, `max_alternatives>1`, `use_enhanced`. Ziel: geringere Latenz/Kosten bei Kurzäusserungen.
+ - **`audioFormat`:** z. B. `webm_opus`, `linear16`, `mp3`, `flac`, `wav` — wenn gesetzt, entfällt `validateAudioFormat()` (Fast-Path); fehlende Sample-Rate wird formattypisch defaulted (z. B. `webm_opus` → 48 kHz).
+- **Fallbacks:** Bei leeren Ergebnissen (wenn nicht `skipFallbacks`) weiterhin Encoding-/Modell-Matrix; erstes Fallback-Modell ist der vom Caller gewählte `model`-Wert.
+
+## Streaming-Erkennung
+
+- **Route:** `POST /voice-google/stt/token` (kurzlebiges `wsToken`), WebSocket **`/voice-google/stt/stream?wsToken=...`** (`routeVoiceGoogle.py`).
+- **Client-Protokoll (JSON):**
+ - `open`: `language`, optional `model`, `lightweight`, `singleUtterance` (Booleans).
+ - `audio`: `chunk` (Base64), typisch WebM/Opus-Fragmente vom `MediaRecorder`.
+ - `close` / `ping` / `pong` unveraendert.
+- **Server-Antworten:** `interim`, `final`, optional **`end_of_single_utterance`** (mit `audioDurationSec`) wenn Google Single-Utterance-Modus endet — Client sendet daraufhin erneut `open` mit denselben STT-Optionen (Recorder laeuft weiter).
+- **Connector:** `streamingRecognize` — `StreamingRecognitionConfig.single_utterance` steuerbar; **Abrechnungs-Dauer** fuer Finals bevorzugt aus `result_end_time` der Streaming-Results (Fallback: Byte-Heuristik).
+
+## Feature-Zuordnung (Ist-Stand)
+
+| Bereich | STT-Pfad | Konfiguration (Kurz) |
+|---------|----------|----------------------|
+| **CommCoach Live** | Streaming WS → Text → Coach | Frontend (`useVoiceStream`): `latest_short`, `lightweight`, `singleUtterance: true` (`useVoiceController`). |
+| **CommCoach Batch** | `processAudioMessage` → `speechToText` | `latest_short`, `lightweight: true` (Format weiterhin Auto-Detect wenn kein `audioFormat`). |
+| **Workspace** | Gleicher generischer WS | `start(language)` ohne Extra-Optionen → Defaults wie frueher (`latest_long`, kein Single-Utterance). |
+| **Teamsbot** | Pro Audio-Chunk `speechToText` (Batch) | Gemeinsamer Connector; **`audioFormat: linear16`** (bekannte PCM-Chunks); Modell/Default wie bisher `latest_long` + volle Features (`lightweight: false`). |
+| **Agent-Tool** `_mediaTools.speechToText` | Batch | Keine zusaetzlichen Argumente → Default-Verhalten. |
+
+## TTS
+
+Unveraendert ueber `textToSpeech` / Gemini-TTS-Pfad im Connector; diese Seite fokussiert STT.
+
+## Weiterfuehrung
+
+- Evaluation **Speech-to-Text v2 / Chirp:** [`wiki/c-work/1-plan/stt-chirp-v2-evaluation.md`](../../c-work/1-plan/stt-chirp-v2-evaluation.md).
diff --git a/b-reference/teams-bot/architecture.md b/b-reference/teams-bot/architecture.md
index 82ede8f..05b7631 100644
--- a/b-reference/teams-bot/architecture.md
+++ b/b-reference/teams-bot/architecture.md
@@ -1,6 +1,6 @@
-
-
+
+
# Teams Meeting Bot -- Architektur
@@ -22,7 +22,21 @@ AI-gesteuerter Meeting-Bot für Microsoft Teams. Tritt Meetings als regulärer T
|------------|----------|-------|
| Gateway ↔ Bot | WebSocket | Echtzeit: Transkripte, Chat, Audio, Status |
| Gateway → Bot | HTTP | Session-Steuerung (join, leave, status) |
-| Frontend ← Gateway | SSE | Live-Transkript-Stream für UI |
+| Frontend ← Gateway | SSE | Live-Transkript-Stream für UI; Dashboard-Push (`dashboard/stream`) |
+
+## Nyla UI (MeetingModule-IA)
+
+Die Feature-Oberfläche ist in **fünf Tabs** strukturiert (siehe auch `wiki/c-work/2-build/2026-04-teamsbot-greenfield-ia-and-live-update.md`):
+
+| Tab | Route-Segment | Zweck |
+|-----|----------------|--------|
+| Dashboard | `dashboard` | KPIs, Modul-Aktivität, Quick-Actions; Daten per **SSE** `GET /api/teamsbot/{instanceId}/dashboard/stream` (Snapshots `sessions` + `modules`, Intervall 3 s bei aktiver eigener Sitzung, sonst 20 s) |
+| Assistent | `assistant` | Wizard: Modul wählen/anlegen, Meeting-Link, Join-Modus (Systembot / Gast / Mein Account), optional Sitzungskontext → startet Session und navigiert zur Live-Ansicht |
+| Module | `modules` | CRUD `TeamsbotMeetingModule`, aufklappbare Session-Liste pro Modul; **Deep-Link** `?moduleId=` klappt das Modul auf und scrollt es ins Sichtfeld |
+| Live-Session | `sessions` | Regie-Panel, UDB, Transkript, SSE `sessions/{id}/stream`; **MFA** (`mfaChallenge` / `mfaResolved`) wird hier über dieselbe SSE-Verbindung abgewickelt |
+| Einstellungen | `settings` | Bot-Stimme, User-Settings, System-Bots (SysAdmin) |
+
+**Datenmodell:** `TeamsbotMeetingModule` gruppiert Reihen; `TeamsbotSession.moduleId` verknüpft optional (Adhoc ohne Modul). Standard-Meeting-Link und Standard-Bot-Name pro Modul für Prefill im Assistenten.
## Kernfähigkeiten
@@ -50,12 +64,15 @@ Der Gateway (Feature `teamsbot`) verwaltet Sessions und stellt die AI-Pipeline b
- WebSocket-Verbindung pro Session
- AI-Analyse der Transkript-Segmente via `serviceAi`
- TTS-Generierung für Voice-Responses
+- **Dashboard-SSE:** `GET /api/teamsbot/{instanceId}/dashboard/stream` — wiederholte JSON-Events `{ "type": "dashboardState", "sessions": [...], "modules": [...] }` mit gleicher Sichtbarkeit wie `GET /sessions` (eigene Sessions, ausser Platform-Admin sieht alle).
## Schlüssel-Dateien
| Datei / Bereich | Rolle |
|-----------------|-------|
-| `gateway/modules/features/teamsbot/` | Gateway-seitiges Feature-Modul |
+| `gateway/modules/features/teamsbot/` | Gateway-seitiges Feature-Modul (inkl. `dashboard/stream`, Session-SSE, Module-CRUD) |
+| `frontend_nyla/src/pages/views/teamsbot/` | Dashboard (SSE), Assistent, Module, Live-Session, Einstellungen |
+| `frontend_nyla/src/api/teamsbotApi.ts` | u.a. `createDashboardStream`, `createSessionStream`, Module-API |
| `service-teams-browser-bot/` | Eigenständiger Bot-Service (separates Repository) |
## Regeln / Invarianten
@@ -65,6 +82,8 @@ Der Gateway (Feature `teamsbot`) verwaltet Sessions und stellt die AI-Pipeline b
- Authentifizierter Join (mit Microsoft-Account) oder Anonymous Guest -- je nach Konfiguration
- Gateway ist die **einzige** Schnittstelle für AI-Aufrufe und TTS -- der Bot-Service selbst hat keine AI-Logik
+**STT auf dem Gateway:** Meeting-Audio-Chunks (WebSocket `audioChunk`, PCM) werden pro Chunk mit `VoiceObjects.speechToText` transkribiert (Batch `recognize`, gemeinsamer Connector mit CommCoach). Konfiguration u. a. `audioFormat=linear16`, `skipFallbacks=True`; Details und Modell-Defaults: [voice-google.md](../gateway/voice-google.md).
+
## Hybrid-Routing: SPEECH_TEAMS + Agent
Der Teamsbot läuft auf zwei kooperierenden Pfaden:
diff --git a/c-work/1-plan/stt-chirp-v2-evaluation.md b/c-work/1-plan/stt-chirp-v2-evaluation.md
new file mode 100644
index 0000000..020fca3
--- /dev/null
+++ b/c-work/1-plan/stt-chirp-v2-evaluation.md
@@ -0,0 +1,22 @@
+# STT: Google Speech-to-Text v2 / Chirp Evaluation (follow-up)
+
+Status: planned (not implemented). Related: gateway `connectorVoiceGoogle.py` uses Speech v1 `SpeechClient` only.
+
+## Goal
+
+Benchmark STT v2 (e.g. Chirp / Chirp 2) for `de-DE` vs current v1 `latest_short` / `latest_long` on:
+
+- Latency (time-to-first-token, final latency)
+- WER / subjective quality in meeting + coaching scenarios
+- Cost and quota
+
+## Steps
+
+1. Add optional v2 client path (`google.cloud.speech_v2` or REST) behind a feature flag.
+2. Run A/B on CommCoach streaming and Teamsbot batch paths with identical audio fixtures.
+3. Document decision in `wiki/b-reference/` and remove flag or make v2 default.
+
+## Notes
+
+- Streaming and batch config differ between v1 and v2; keep `VoiceObjects` as the single facade.
+- Billing hooks (`calculateSttCostCHF`) must use measured duration (see streaming `result_end_time`), not compressed byte heuristics.
diff --git a/c-work/_CHANGELOG.md b/c-work/_CHANGELOG.md
index bb42edd..e1c87fb 100644
--- a/c-work/_CHANGELOG.md
+++ b/c-work/_CHANGELOG.md
@@ -12,8 +12,16 @@ type: `feat` `fix` `refactor` `docs` `test` `chore` `build` · scope: `gateway
Skip: reine Refactors, Formatting, Lint, Dep-Bumps, Test-only, Wiki-Tippfehler.
+## 2026-05-11
+
+- 2026-05-11 | feat | gateway, frontend-nyla, wiki | TeamsBot: `GET /api/teamsbot/{instanceId}/dashboard/stream` (SSE dashboardState 3s/20s); dashboard consumes EventSource + reconnect; module tiles navigate to `modules?moduleId=` with expand + scroll highlight; canonical `b-reference/teams-bot/architecture.md`, TOPICS, `b-reference/frontend-nyla/architecture.md` (Teams Bot UI row). (c-work: 2-build/2026-04-teamsbot-greenfield-ia-and-live-update.md)
+
## 2026-05-10
+- 2026-05-10 | feat | frontend-nyla | TeamsBot UI aligned to greenfield IA: dashboard as KPI + module-activity + quick actions (no duplicate start form); MFA on live session SSE; assistant step adds join mode, MS account block, session context; modules header `Modul anlegen` dialog + `Meeting starten`; nav icons for assistant/modules; `FEATURE_REGISTRY` tab label Dashboard. (c-work: 2-build/2026-04-teamsbot-greenfield-ia-and-live-update.md)
+- 2026-05-10 | feat, fix | gateway, frontend-nyla, teams-bot | TeamsBot: `startSession` binds `moduleId` with validation; DB migration M2 `TeamsbotMeetingModule.defaultMeetingLink` / `defaultBotName`; assistant prefill + searchable multi-row module list; modules edit saves defaults; session view polls while pending/joining even with SSE and syncs switcher row; browser bot chat compose marker + safe `AudioContext.close`. (c-work: 2-build/2026-04-teamsbot-greenfield-ia-and-live-update.md)
+- 2026-05-10 | docs | wiki | Kanon: `b-reference/gateway/voice-google.md`; TOPICS + README Ordnerbaum; Querverweise in gateway/architecture, teams-bot/architecture, frontend-nyla/architecture, ai-agent.
+- 2026-05-10 | feat | gateway, frontend-nyla | STT: configurable model/lightweight/audioFormat on batch `speechToText`; streaming supports model/lightweight/singleUtterance; duration from `result_end_time`; WS `open` + `end_of_single_utterance` replumbing. CommCoach uses `latest_short` + lightweight + single-utterance; Teamsbot passes `audioFormat=linear16`. Chirp/v2 evaluation tracked in `wiki/c-work/1-plan/stt-chirp-v2-evaluation.md`.
- 2026-05-10 | fix | gateway | CommCoach: conversational turns use `operationType=DATA_QUERY` + `priority=SPEED` for faster model selection (gpt-5.4-mini instead of gpt-5.5); model selector speed priority weight scaled from `/10` to `*100` to be meaningful.
- 2026-05-10 | fix | gateway | CommCoach: persona sessions now distinguish first vs follow-up; opening prompt references prior sessions instead of re-introducing persona every time.
- 2026-05-10 | feat | gateway | Document generation: unified `documentTitle` style separate from `headings.h1`; BASE/renderer converts independently; HTML/CSS, PDF title block, Markdown/Text heading offsets updated; DEFAULT_STYLE h1 lowered vs title.
diff --git a/d-guides/deployment/poweron-sec.kdbx b/d-guides/deployment/poweron-sec.kdbx
index 77642e3eca5fddf5f10ae34b6d1c8b470aa8024c..e514c2f76054c69b55cd36b3933674dc0441d1ed 100644
GIT binary patch
literal 23150
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
ZLfyWkC;g|p$gGN&u1R(4P2hTBnXQ*x3}yfT
literal 23806
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