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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 F))5cfH{SpN