Protokoll der abgeschlossenen Arbeiten. Kurze Referenz - Details in Ticket-System.
Status: Abgeschlossen
Beschreibung: Professionelles Installer-System mit Textual-basierter TUI. Baut Installer fuer 4 Modi (server/client/standalone/config) als .tar.gz Pakete. Eigenstaendiges Projekt ohne trixy_core-Import.
Neue Dateien:
make_installer/common.sh — Gemeinsame Build-Funktionen (Version parsen, tar erstellen, install.sh generieren)make_installer/make_installer_{server,client,standalone,config}.sh — 4 modus-spezifische Build-Scriptsmake_installer/exclude_patterns.txt — tar-Excludes (Trainings-/Modelldaten, Cache, Tests)make_installer/installer/app.py — InstallerApp(textual.App) mit F-Key-Navigationmake_installer/installer/config.py — InstallerConfig Dataclass mit Validierungmake_installer/installer/steps.py — Gewichtete InstallationStep-Definitionen pro Modusmake_installer/installer/runner.py — InstallRunner mit async Subprocess, Progress, Abbruchmake_installer/installer/menu_context.py — Standalone-Kopie von trixy_core MenuContext/MenuBindingmake_installer/installer/views/{system,network,plugins,requirements,agreement,install}_view.py — 6 Tab-Views (F1-F6)make_installer/installer/widgets/{header,footer,log_field}.py — TUI-Widgetsmake_installer/installer/css/installer.tcss — TUI-Stylingmake_installer/installer/{agreement.md,plugins.json,requirements.txt} — RessourcenBuild-Output pro Modus:
trixy-{mode}-{version}.tar.gz — Quellcode (Server: 375M, Client: 132M, Config: 512K)trixy-installer-{mode}-{version}.tar.gz — Installer TUI (15K)install-{mode}.sh — Bootstrap-Script (3K)Notizen:
Status: Abgeschlossen
Beschreibung: Einheitliches ML-Trainer-Framework mit ITrainer ABC, TrainerRegistry (Core + Plugin Discovery), TrainerService (multiprocessing.Process mit Queue-Polling), 18 Netzwerk-Commands (9 Request/Response-Paare), 9 ConfigListener-Handler, ConfigConnection-API (9 Methoden), LossChart-Widget (Braille U+2800-U+28FF, Bresenham-Linien, Downsampling), 7 TUI-Views (Trainer-Liste + 6 Sub-Navigation: Info/Settings/Dataset/Optional/Validate/Training).
Neue Dateien:
trixy_core/trainer/__init__.py — Package-Init mit Exports (inkl. TrainerApplication-Migration)trixy_core/trainer/enums.py — TrainingState (IDLE→FAILED), TrainerType (CORE/PLUGIN)trixy_core/trainer/dataclasses.py — TrainerInfo, TrainingProgress, ValidationResult, FormSchematrixy_core/trainer/itrainer.py — ITrainer ABC mit Schema/Train/Validate-Methodentrixy_core/trainer/registry.py — Discovery aus core/.py + plugins//trainer.pytrixy_core/trainer/service.py — TrainerService(IService) mit Subprocess-Trainingtrixy_core/trainer/application.py — TrainerApplication (migriert aus trainer.py)trixy_core/trainer/core/__init__.py — Core-Trainer Packagetrixy_core/trainer/core/wakeword_trainer.py — PoC WakewordTrainer mit Settings/Dataset-Schematrixy_core/tui/widgets/loss_chart.py — Braille-Loss-Chart (Train=cyan, Val=magenta)trixy_core/tui/css/trainer.tcss — Trainer-Stylestrixy_core/tui/views/trainer_view.py — F7 Trainer-Liste (DataTable)trixy_core/tui/views/trainer_info_view.py — F1 TrainerInfo (StatusTable)trixy_core/tui/views/trainer_settings_view.py — F2 Schema-basiertes Formulartrixy_core/tui/views/trainer_dataset_view.py — F3 Dataset-Info + Formulartrixy_core/tui/views/trainer_optional_view.py — F4 Optionale Daten (ausblendbar)trixy_core/tui/views/trainer_validate_view.py — F5 Validierung + GPU-Infotrixy_core/tui/views/trainer_training_view.py — F6 Start/Pause/Stop/Resume + LossChartGeaenderte Dateien:
trixy_core/network/cmd/config_cmd.py — 18 neue Trainer-Command-Dataclassestrixy_core/network/cmd/__init__.py — Import + Export der Trainer-Commandstrixy_core/network/config_listener.py — 9 Trainer-Handler + Importstrixy_core/server.py — TrainerService instanziiert und registrierttrixy_core/config_app.py — 9 Trainer-API-Methoden, Trainer-Views-Setuptrixy_core/tui/app.py — Trainer-Kontext (TRAINER_SUBVIEW_IDS, F7, Sub-Navigation)Status: Abgeschlossen
Beschreibung: Wakeword-Trainer v3 mit umfassender Audio-Augmentation nach OpenWakeWord-Vorbild (data.py). Komma-separierte Wakeword-Aliase, Pitch-Shifting, Klangfarbe-/Prosodie-Variation (Piper noise_scale/noise_w_scale), Lautstaerke-Variation, Rausch-Augmentation (white/pink/brown), Background-Mix mit Musik aus assets/ (ffmpeg-Konvertierung in Temp-Dateien), TTS-Engine-Discovery.
Neue Features (gegenueber v2):
Geaenderte Dateien:
trixy_core/trainer/core/wakeword_trainer.py — v3: Alle Augmentations, Background-Mix, Engine-DiscoveryStatus: Superseded by v3 (2026-03-07)
Beschreibung: Realer Wakeword-Trainer basierend auf dem OpenWakeWord Custom-Verifier-Ansatz. Verwendet OWW-Preprocessor fuer Feature-Extraktion (Mel-Spectrogram + Embeddings) und scikit-learn LogisticRegression-Pipeline als Classifier. TTS-Datengenerierung via Piper TTS im F4 Optional Tab fuer synthetische Trainings-Samples.
Architektur:
Neue Features:
ITrainer.execute_action(action, params) — Erweiterungspunkt fuer Trainer-AktionenConfigTrainerActionRequest/Response — Netzwerk-Commands fuer Trainer-AktionenGeaenderte Dateien:
trixy_core/trainer/core/wakeword_trainer.py — Komplett neu: Real OWW Training + TTS-Generierungtrixy_core/trainer/itrainer.py — execute_action() Methode hinzugefuegttrixy_core/trainer/service.py — execute_action() Delegationtrixy_core/network/cmd/config_cmd.py — ConfigTrainerActionRequest/Responsetrixy_core/network/cmd/__init__.py — Neue Command-Exportstrixy_core/network/config_listener.py — _handle_trainer_action() Handlertrixy_core/config_app.py — execute_trainer_action() API-Methodetrixy_core/tui/views/trainer_optional_view.py — Aktions-Buttons + Status-AnzeigeStatus: Abgeschlossen
Beschreibung: Template-Formatter komplett ueberarbeitet und um Features aus dem C++ PrintText-Projekt erweitert. 5-Phasen-Pipeline: Platzhalter → Math → Logic → String-Ops → Zahlenformat.
Neue Dateien:
trixy_core/utils/math_eval.py — Recursive-Descent-Parser fuer mathematische Ausdruecke (+, -, *, /, %, ^, &, |, xor, not, nand, nor). Hex, Scientific Notation, Klammern.trixy_core/utils/logic_eval.py — Ternary-Evaluator (cond ? true : false), Else-If (::), Vergleiche (==, !=, <, >, <=, >=), Typ-Pruefung (===), Versionen, Boolean-Keywords.Geaenderte Dateien:
trixy_core/utils/template_formatter.py — Komplett neu: 5 Phasen, {app.*} Namespace fuer magische Klassenkonstanten, String-Ops (, , , , , , , ), Zahlenformat (, , , )
trixy_core/scheduler/service.py — application + event_manager in Scheduler-Kontext injizierttrixy_core/scheduler/action/tts.py — format_template() erhaelt application fuer {app.*}Status: Abgeschlossen
Beschreibung: Neue Scheduler-Action fuer TTS-Sprachausgabe. SchedulerService in Server registriert. Timing-Bugs in IntervalTrigger/CronTrigger behoben (feuerten jede Sekunde statt konfiguriertem Intervall). TTS-Event-API korrigiert (emit→trigger mit TTSRequest). DuplicateIds in Config-Tool Schedule-Views behoben.
Neue Dateien:
trixy_core/scheduler/action/tts.py — TTSSpeakAction mit Template-Support, Server/Standalone-ModusGeaenderte Dateien:
trixy_core/scheduler/scheduler.py — TTSSpeakAction registriert, last_fire_time in TriggerContexttrixy_core/scheduler/trigger/cron.py — Doppel-Ausfuehrung in gleicher Sekunde verhinderttrixy_core/scheduler/service.py — IService-konform (start/stop, Dependencies, application)trixy_core/server.py — SchedulerService registrierttrixy_core/tui/views/schedule_trigger_view.py — Container-Replace statt remove_children()trixy_core/tui/views/schedule_action_view.py — Container-Replace (3 Stellen)trixy_core/tui/views/schedule_condition_view.py — Container-Replace (2 Stellen)Status: Abgeschlossen
Beschreibung: Satellite F4 (Konfiguration) ermoeglicht jetzt das Lesen und Schreiben der Client-Config via Server-Proxy. Der Server leitet Config-Anfragen an den Satellite weiter (request_and_wait mit Future-Korrelation). Typ-spezifische Editoren (Select, Bool-Switch, Zahlen mit Validierung) funktionieren wie beim Haupt-Config-View. Ausserdem: PageUp/PageDown scrollt ±5 Zeilen, Mausrad scrollt ±1 Zeile.
Neue Commands:
ConfigSatelliteConfigReadRequest/Response — Config-Lese-ProxyConfigSatelliteConfigWriteRequest/Response — Config-Schreib-ProxyGeaenderte Dateien:
trixy_core/satellite/satellite.py — +_pending_responses, +request_and_wait(), +resolve_pending()trixy_core/network/service.py — ClientHandler._handle_message prueft pending responses vor dispatchtrixy_core/client.py — +_handle_config_read_proxy(), +_handle_config_write_proxy(), config_listener_enabled Flagtrixy_core/config/datasets/client.py — +config_listener_enabled: boolconfig/client_config.json — config_listener_enabled: false (gleicher Rechner)trixy_core/network/config_listener.py — +_handle_satellite_config_read/write (Proxy-Handler)trixy_core/config_app.py — +request_satellite_config(), +write_satellite_config()trixy_core/tui/views/sat_config_view.py — Komplett umgebaut: Tree + ConfigEditorPanel via Proxytrixy_core/tui/app.py — PageUp/PageDown Bindings, scroll_sensitivity_y=1.0Notizen:
Status: Abgeschlossen
Beschreibung: Config-View (F2) verwendet jetzt typ-spezifische Editoren statt einfachem Text-Input. Jedes Feld bekommt den passenden Editor: Select-Dropdown (Log-Level, Sample-Rate, Channels), Boolean-Switch, validiertes Zahlenfeld (Min/Max), Multi-Select (Wakeword-Modelle, STT-Layer), IP-Adressen-Validierung, Readonly fuer Dicts. Dynamische Optionen (installierte Wakeword-Modelle) werden vom Server abgefragt.
Neue Dateien:
trixy_core/tui/config/__init__.py — Package-Inittrixy_core/tui/config/field_registry.py — FieldMeta Dataclass, EditorType Enum, Registry-Builder fuer Server/Standalone/Client, Auto-Inferenz Fallbacktrixy_core/tui/widgets/config_editors.py — ConfigEditorPanel (dynamischer Editor mit Validierung, emittiert Submitted-Message)Geaenderte Dateien:
trixy_core/network/cmd/config_cmd.py — +ConfigFieldOptionsRequest, +ConfigFieldOptionsResponsetrixy_core/network/cmd/__init__.py — Neue Exportstrixy_core/network/config_listener.py — +_handle_field_options(), +_scan_wakeword_models(), List-Typ-Konvertierung in _handle_config_write()trixy_core/config_app.py — +request_field_options() auf ConfigConnectiontrixy_core/tui/views/config_view.py — Komplett umgebaut: Registry+dynamische Optionen laden, ConfigEditorPanel statt Input+Buttontrixy_core/tui/css/config.tcss — Neue Styles fuer #config-editortrixy_core/tui/widgets/__init__.py — +ConfigEditorPanel ExportNotizen:
Status: Abgeschlossen
Beschreibung: F3-Taste im Config-Tool zeigt je nach Instanz-Typ unterschiedliche Ansichten. Bei Server-Verbindung: Satellites-Liste mit Verbindungsstatus, Buttons fuer Registrierung/Trennen/Loeschen, Auto-Update alle 10s. Selektion oeffnet Satellite Sub-Navigation mit 5 eigenen F-Tasten-Views. Bei Client/Satellite-Verbindung: SubViews direkt als Haupt-Navigation.
Satellite Sub-Main Views:
Neue Dateien:
trixy_core/tui/views/satellites_view.py — SatellitesView (ListView, Aktions-Buttons, periodisches Refresh)trixy_core/tui/views/sat_info_view.py — Satellite F1: Allgemeine Infostrixy_core/tui/views/sat_connection_view.py — Satellite F2: Socket-Verbindungentrixy_core/tui/views/sat_conversation_view.py — Satellite F3: Wakeword/VoiceRec/Konversationtrixy_core/tui/views/sat_config_view.py — Satellite F4: Client-Konfigurationtrixy_core/tui/views/sat_updates_view.py — Satellite F5: Update-Buttonstrixy_core/tui/css/satellites.tcss — Styles fuer Satellite-ViewsGeaenderte Dateien:
trixy_core/tui/app.py — Komplett umgebaut: Dual-Modus (Haupt vs Satellite-Kontext), F1-F5/F9/F10 kontextabhaengig, MenuContext-Wechsel im Footertrixy_core/tui/menu_context.py — Numerische Sortierung (f10 nach f9)trixy_core/config_app.py — 5 Satellite-SubViews erstellen, bedingt nach Instanz-Typtrixy_core/network/cmd/config_cmd.py — +ConfigSatelliteDetailRequest/Response (detaillierte Satellite-Infos)trixy_core/network/cmd/__init__.py — Neue Exportstrixy_core/network/config_listener.py — +_handle_satellite_detail() (Info/Sockets/Conversation Daten)trixy_core/config_app.py — +request_satellite_detail() auf ConfigConnectionNotizen:
Status: Abgeschlossen
Beschreibung:
Neuer main.py config Modus — Textual-TUI die sich per TRXI-Protokoll mit einer laufenden Server/Client/Standalone-Instanz verbindet. Alle Instanzen bekommen einen ConfigListener auf Port 2105 fuer eingehende Config-Tool-Verbindungen. F1=Health (System-Metriken, periodisch aktualisiert), F2=Config (Remote-Config lesen/schreiben), F9=Log (Platzhalter).
Neue Dateien:
trixy_core/network/cmd/config_cmd.py — 9 CommandMessage-Dataclasses (ConfigConnect/Accepted/Denied, StatusRequest/Response, ReadRequest/Response, WriteRequest/Response)trixy_core/network/config_listener.py — ConfigClientHandler + ConfigListener IService (Port 2105, Handshake, Status/Config-Handling mit psutil)trixy_core/config_app.py — ConfigConnection (TCP+TRXI Request/Response-Korrelation) + ConfigApplication (Textual-TUI Hauptschleife)trixy_core/config/datasets/config_tool.py — ConfigToolConfig Dataclassconfig/config_tool_config.json — Default-Konfigurationtrixy_core/tui/ — Komplettes TUI-Framework:
app.py — TrixyTUI (Textual App, F-Tasten, periodisches Refresh)menu_context.py — MenuContext + MenuBindingviews/base.py — MainView / SubMainView Basisklassenviews/health_view.py — System-Metriken mit farbigen ASCII-Balkenviews/config_view.py — Config-Baum mit Inline-Editingviews/log_view.py — Platzhalter fuer Live-Logswidgets/header.py — TrixyHeader (Titel + Verbindungsinfo)widgets/footer.py — TrixyFooter (F-Tasten-Leiste)widgets/status_table.py — Key-Value-Tabellewidgets/popup.py — PopupWindow (Modal)css/base.tcss, health.tcss, config.tcss, popup.tcss — StylingGeaenderte Dateien:
main.py — Neuer config Subparser + run_config() + Docstring aktualisierttrixy_core/network/cmd/__init__.py — 9 neue Config-Exportstrixy_core/config/datasets/server.py — config_port: int = 2105 in NetworkConfigtrixy_core/config/datasets/standalone.py — config_port: int = 2105 in StandaloneConfigtrixy_core/config/datasets/client.py — config_port: int = 2105 in ClientConfigtrixy_core/config/datasets/__init__.py — ConfigToolConfig Exportconfig/server_config.json — "config_port": 2105 hinzugefuegtconfig/standalone_config.json — "config_port": 2105 hinzugefuegttrixy_core/server.py — ConfigListener Import + Instanziierung + Service-Registrierungtrixy_core/standalone.py — ConfigListener Import + Instanziierung + Service-Registrierungtrixy_core/client.py — ConfigListener Import + Instanziierung + Service-RegistrierungAbhaengigkeiten: textual, psutil (fuer System-Metriken)
Status: Abgeschlossen
Beschreibung: Bidirektionaler Daten-Sync zwischen Standalone und Server implementiert. Standalone verbindet sich automatisch zum Server wenn WLAN verfuegbar (Probe-Loop). Daten werden per Last-Write-Wins synchronisiert. Erster Consumer: Notes-Plugin.
Neue Dateien:
trixy_core/sync/models.py — SyncItem Dataclasstrixy_core/sync/store.py — SyncStore (JSON-per-Entity Persistenz in ./sync_data/)trixy_core/sync/__init__.py — Paket-Exportstrixy_core/sync/connection.py — SyncConnection (Command-Only TCP, Port 2101)trixy_core/sync/service.py — SyncService (Standalone-seitig, Probe-Loop + periodischer Sync)trixy_core/sync/handler.py — SyncHandler (Server-seitig, SyncPush/SyncRequest Verarbeitung)trixy_core/network/cmd/sync.py — SyncPush, SyncRequest, SyncResponse, SyncAck Commandsplugins/notes/main.py — NotesPlugin (create/list/search/delete Notizen per Sprache)plugins/notes/config.json — Plugin-KonfigurationGeaenderte Dateien:
trixy_core/application.py — _sync_store Feld + sync_store Property auf IApplicationtrixy_core/config/datasets/standalone.py — SyncConfig Dataclass + Feld in StandaloneConfigconfig/standalone_config.json — Neuer sync Abschnitttrixy_core/standalone.py — SyncStore + SyncService Lifecycletrixy_core/server.py — SyncStore + SyncHandler + Message-Handler Registrierungtrixy_core/network/cmd/__init__.py — Sync-Commands exportiertArchitektur:
./cron/*.json)updated_at ISO 8601 VergleichStatus: Abgeschlossen
Beschreibung: Automatisches File-Logging-System implementiert mit separaten Log-Dateien pro Plugin und fuer Core-Komponenten.
Aenderungen:
trixy_core/utils/logging/file_router.py: FileLogRouter-Klasse mit ContextVar-basiertem Routing, log_as() Context-Manager, init_file_router()/shutdown_file_router() FunktionenLoggingConfig erweitert: file_log_level, plugin_timeout_seconds, plugin_max_failuresdebug.py: _output() routet jetzt zusaetzlich zum FileLogRouter (in beiden Modi)IApplication: _init_file_logging() und _shutdown_file_logging() MethodenServerApplication/StandaloneApplication: File-Logging in initialize()/stop() integriertPluginManager: Timeout-Schutz via _call_plugin() mit asyncio.wait_for(), Auto-Disable nach N Fehlschlaegen, alle Plugin-Lifecycle-Calls in log_as() gewrapptEventManager: component_name Feld in EventHandler, automatische Plugin-Erkennung in register_object(), Handler-Invocation in log_as() gewrapptErgebnis: logs/core.log fuer Core, logs/plugins/<name>.log pro Plugin
Status: Abgeschlossen
Beschreibung: LLM-basierte Intent-Erkennung (~9s) durch Keyword-Matcher Pre-Filter ergaenzt. Eindeutige Befehle werden jetzt in <5ms erkannt, LLM nur noch als Fallback.
Neue Dateien:
trixy_core/nlp/keyword_matcher.py — Kern-Matcher mit Pattern-Parsing, Fuzzy-Matching, Sentiment-AnalyseArchitektur:
@pattern() (stackbar), @example(), Signatur-basierte Slot-Erkennung(a|b) Pflicht, [a|b] optional, {slot} Slot, {a|b|} inline-optional.claude/project-knowledge/ (7 Knowledge-Dateien)docs/project_notes/ (4 Memory-Dateien)docs/api/README.md - Index mit Architektur-Übersichtdocs/api/utils.md - Debug, Logging, Decorators, Validation, Rate-Limitingdocs/api/service.md - IService, ServiceContainer, CircuitBreaker, Scopes, Metricsdocs/api/events.md - EventManager, Middleware, Throttling, Persistence, DLQdocs/api/config.md - ConfigManager, Environment, Secrets, Migrationdocs/api/network.md - TrixyProtocol, Encryption, Security, TLS, ConnectionPooldocs/api/satellite.md - Satellite, Groups, LoadBalancing, Health, Failoverdocs/api/plugins.md - TrixyPlugin, Versioning, Dependencies, Hooks, Hot-Reload, Testingtrixy_core/arbitration/__init__.pytrixy_core/arbitration/candidate.pytrixy_core/arbitration/window.pytrixy_core/arbitration/arbitrator.pytrixy_core/arbitration/strategies/__init__.pytrixy_core/arbitration/strategies/base.pytrixy_core/arbitration/strategies/loudest.pytrixy_core/arbitration/strategies/confidence.pytrixy_core/arbitration/strategies/combined.pytrixy_core/arbitration/strategies/proximity.pydocs/api/network.md - Retry, KeepAlive, Compression, RPCdocs/api/satellite.md - Capability Discovery, Metrics (vollständig)docs/api/README.md - Architektur-Diagramm aktualisierttrixy_core/wakeword/):
detector.py: WakewordDetector (OpenWakeWord-Wrapper), WakewordDetection, DetectorConfigaudio_buffer.py: AudioBuffer, AudioChunk, AudioBufferPool für Aufnahmen im RAMvad.py: VoiceActivityDetector für Sprach-/Stille-Erkennungservice.py: WakewordService (IService) mit vollständigem Workflowtrixy_core/conversation/):
session.py: ConversationSession mit Turn-Tracking, Follow-Ups, Timeoutsmanager.py: ConversationManager (IService) für Session-Lifecyclecontext.py: ConversationContext mit Scopes (Turn, Session, User, Global)trixy_core/network/cmd/wakeword.py):
trixy_core/network/service.py):trixy_core/network/client_connection.py):trixy_core/network/message_handler.py):trixy_core/server.py - NetworkService Integrationtrixy_core/client.py - ClientConnection statt TODOtrixy_core/network/__init__.py - Neue Exportstrixy_core/scheduler/trigger/):CronTrigger: Cron-Ausdrücke (*/5 * * * *, 0 9-17 * * 1-5)IntervalTrigger: Feste Intervalle (Sekunden, Minuten, Stunden)DateTimeTrigger: Einmaliger ZeitpunktEventTrigger: Reagiert auf EventManager-EventsAndTrigger, OrTrigger: Composite Triggerstrixy_core/scheduler/condition/):TimeRangeCondition, DayOfWeekCondition, DateRangeConditionRecentActivityCondition, ActivityCountConditionSensorThresholdCondition, SensorChangeCondition, ComparisonOperatorStateCondition, BooleanCondition, ExistsConditionAndCondition, OrCondition, NotCondition, XorConditiontrixy_core/scheduler/action/):EmitEventAction, MultiEventAction: Event-EmittierungCallbackAction, MethodAction: Python-FunktionenCommandAction, ScriptAction: Shell-Befehle/Scriptstrixy_core/scheduler/scheduler.py):./cron/*.jsontrixy_core/scheduler/service.py):SchedulerService (IService) für ServiceContainertts_request Event ausstream_start Event aus für Audio/Musik-Wiedergabestream_stop Event austts_completed Eventtrixy_core/events/event_data/basic.py):
TTSRequest: TTS-Anfrage mit request_id, satellite_id, text, voice, speed, volumeTTSCompleted: TTS-Abschluss mit success, audio_duration, errorStreamStart: Audio-Stream starten mit source, volume, stream_typeStreamStop: Audio-Stream stoppenProcessingResult: Verarbeitungsergebnis für Standalone-Modustrixy_core/satellite/satellite.py - Application-Referenz, speak(), play(), stop_playback()trixy_core/satellite/satellite_manager.py - Setzt Application-Referenz bei add()trixy_core/satellite/api.py - Warte-Logik mit Future und Handlertrixy_core/wakeword/service.py - _wait_for_processing_result() implementierttrixy_core/events/event_data/basic.py - Neue Event-Klassentrixy_core/events/event_data/__init__.py - Neue Exportstrixy_core/audio/player.py):StreamingAudioPlayer: Queue-basierter Audio-Player mit PyAudioAudioOutputManager: Verwaltet TTS und Musik getrennttrixy_core/audio/processing/):AudioProcessingContext: Kontext mit Position, Track, Wakeword-Status, etc.AudioProcessor: Abstract Base Class für ProzessorenProcessorPriority: Enum für Pipeline-Reihenfolge (DUCKING, CROSSFADE, VOLUME, etc.)AudioProcessingPipeline: Thread-safe Pipeline-Managerapply_volume(), mix_chunks(), fade_chunk()trixy_core/plugins/extensions/points/audio.py):AUDIO_PROCESSOR_POINT: Extension Point für Audio-ProzessorenAudioProcessorExtension: Basis-Extension für Pluginstrixy_core/network/cmd/satellite.py):SatelliteAccepted erweitert um TTS/Musik Audio-FormatAudioConfigUpdate: Neue Nachricht für TTS-Plugin-Wechseltrixy_core/client.py - AudioOutputManager Integration, Audio-Format-Handlingtrixy_core/network/client_connection.py - Audio-Format aus SatelliteAcceptedtrixy_core/music/player.py - Pipeline-Integration in Playback-Looptrixy_core/music/queue.py - peek_next() Methodetrixy_core/music/playlist/playlist.py - peek_next() Methodetrixy_core/plugins/extensions/points/__init__.py - Audio Exportstrixy_core/audio/player.pytrixy_core/audio/processing/__init__.pytrixy_core/audio/processing/context.pytrixy_core/audio/processing/processor.pytrixy_core/audio/processing/pipeline.pytrixy_core/plugins/extensions/points/audio.pymax_buffer_ms: Maximale Pufferzeit in Millisekunden (Standard: 2000ms)prebuffer_ms: Vor-Pufferung bevor Wiedergabe startet (Standard: 200ms)__post_init__(): Berechnet max_queue_size und start_threshold automatischbytes_per_second Property für Audio-Format-Berechnungbuffer_ms Property für aktuelle Queue-Kapazität in msbuffer_ms: Aktuelle Pufferzeit in Millisekundenbuffer_level: Puffer-Füllstand (0.0 - 1.0)buffer_full: True wenn Puffer >90% voll (Backpressure-Signal)buffer_low: True wenn Puffer <20% (Nachfüll-Signal)stats erweitert um buffer_ms, buffer_level, max_buffer_mstrixy_core/audio/player.pytests/test_audio_player.py (17 neue Tests)plugins/crossfade/main.py - CrossfadePlugin (TrixyPlugin)plugins/crossfade/processor.py - CrossfadeProcessor (AudioProcessor)plugins/crossfade/config.json - Konfigurationplugins/crossfade/tests/test_crossfade.py - 34 Testsplugins/crossfade/tests/generate_test_mixes.py - Demo-Generatorcontext.is_near_end und context.has_next_trackmix_chunks() Hilfsfunktioncrossfade_audio(): Mischt zwei Audio-Bytestreamssave_wav(): Speichert PCM als WAVload_wav(): Lädt WAV-Dateiassets/default/music/crossfade_tests/):
frequency_crossfade_*.wav - Sinuswellen mit verschiedenen Kurvenduration_crossfade_*.wav - Verschiedene Crossfade-Dauernsweep_crossfade.wav - Frequenz-Sweepsbeat_crossfade.wav - Beat-Übergängechain_crossfade_4_tracks.wav - 4-Track Demo-Mixpython plugins/crossfade/tests/generate_test_mixes.py--with-music Flag (erfordert ffmpeg)trixy_core/assets/manager.py):trixy_core/assets/service.py):manager.get("audio/success.wav") → Sucht in Profil, Fallback auf Defaultmanager.get_audio("success.wav") → Typ-spezifischer Zugriffmanager.list_assets(AssetType.AUDIO) → Alle Audio-Assetsmanager.get_stats() → Statistiken über alle Assetsmanager.copy_to_profile("audio/error.wav") → Asset in Profil kopierentrixy_core/assets/__init__.pytrixy_core/assets/manager.pytrixy_core/assets/service.pytests/test_assets.pytrixy_core/nlp/ - Core NLP-Infrastrukturprovider.py - NLPProvider, NLPConfig, NLPContext, NLPResult, NLPStateintent_registry.py - IntentRegistry (Singleton), IntentDefinition, IntentSlotdecorators.py - @intent Decorator für Plugin-Methodenhandler.py - IntentReceivedData, IntentResult Datenklassenplugins/nlp_llm/ - LLM-basiertes NLP-Pluginspeech_recognized → NLP Pluginintent_received (mit optionalem response_text)create_output_text → Response Generator → TTSAbgeschlossen:
trixy_core/audio/microphone.py - MicrophoneCapture (sounddevice-basiert, 16kHz mono, 80ms Frames)trixy_core/config/datasets/client.py - ClientWakewordConfig um enabled, silence_timeout, max_recording, pre_buffer erweiterttrixy_core/wakeword/service.py - DEPENDENCIES Fix, Mikrofon-Integration, Audio-Streaming via Port 2102, Future-basierte Arbitration, handle_wakeword_selected/abort/conversation_end, setup_for_client()trixy_core/client.py - WakewordService + MicrophoneCapture Integration, Command-Routing (WakewordSelected/Abort/RecordingStop)WakewordArbitrator wurde nie in server.py erstellt/gestartet → niemand hörte auf wakeword_detected Eventevent_manager statt events, satellite_manager statt satellitesself.logger (Python logging) statt pinfo/pdebug/perror/pwarn (TUI-Output)trixy_core/server.py - WakewordArbitrator erstellen, starten und stoppentrixy_core/arbitration/arbitrator.py - Property-Namen Fix, self.logger → pinfo/pdebug/perror/pwarn, fehlender await bei emit()trixy_core/events/event_data/basic.py — 4 neue EventData-Klassentrixy_core/events/event_data/__init__.py — Exports erweiterttrixy_core/satellite/satellite.py — Attribute, Properties, 4 Methoden, 3 Handler, Guardswakeword_trim_seconds in WakewordConfig (0.0 = kein Trim)In Arbeit:
Blockiert:
Status: Abgeschlossen
Status: Abgeschlossen
plugins/music/) mit YouTube-Suche (yt-dlp) und lokaler MusikbibliothekStatus: Abgeschlossen
stt_completed (dict via emit()), aber NLP-Plugin lauscht auf speech_recognized (EventData via trigger())stt_completed zusätzlich speech_recognized Event mit SpeechRecognized EventData emittieren (nur bei nicht-leerem Text)metadata["session_id"] transportiert (SpeechRecognized hat kein eigenes session_id-Feld)Status: Abgeschlossen
emit()) auf typisierte EventData-Klassen (trigger()) umgestellttrixy_core/events/event_data/download.py — 6 EventData-Klassen (BeforeDownload, DownloadProgress, DownloadCompleted, DownloadFailed, BeforeExtract, ExtractCompleted)progress_callback Parameter aus allen Download-Funktionen, default_progress_callback(), DownloadProgress.callback FeldDownloadProgress → DownloadProgressTracker (Alias beibehalten fuer Kompatibilitaet)Status: Abgeschlossen
plugins/calendar/):
main.py — CalendarPlugin (Orchestrator): Provider-Init, Sync, Notifications, Intent-Handlermodels.py — CalendarEvent, CalendarInfo, NotificationRecord, EventStatusutils.py — Datums-/Zeit-Parsing (deutsch), TTS-Formatierungproviders/base.py — CalendarProvider ABC (connect, disconnect, fetch_events, create_event, health_check)providers/microsoft.py — Microsoft Graph API (Client Credentials + Device Code Flow, httpx + msal)providers/google.py — Google Calendar API (Service Account + OAuth2, google-auth + google-api-python-client)providers/caldav_provider.py — CalDAV (caldav + icalendar Libraries)mapping.py — SatelliteCalendarMapper (Satellite ↔ Kalender per Alias/Room, globale Kalender)sync.py — CalendarSyncManager (periodischer Sync via Scheduler, In-Memory Cache, asyncio.Lock)notifications.py — NotificationManager (60s Check-Loop, Reminder + Start-Sounds, Quiet Hours, Duplikat-Vermeidung)intents.py — 6 Intent-Definitionen (next/search/attendees/person/create/list appointments)config.json — Provider-Credentials, Kalender-Definitionen, Satellite-Mapping, Sync/Notification-OptionenStatus: Abgeschlossen
Beschreibung:
Standalone-Modus (python3 main.py standalone) hatte keine funktionierende Audio-Pipeline — WakewordService, MicrophoneCapture und AudioOutputManager fehlten.
Aenderungen:
wakeword/service.py:767: self.application.event_manager.emit() → await self._application.events.emit()config/datasets/standalone.py: WakewordConfig (Server) → ClientWakewordConfig (hat model_directory, use_onnx, enabled, etc.)tts_completed EventNeue Event-Pipeline: Mikrofon → WakewordService → raw_audio_received → STT → speech_recognized → NLP → intent_received → IntentDispatcher → output_text_created → TTS → tts_completed → AudioOutputManager
Status: Abgeschlossen
Beschreibung: Notes-Plugin v2.0 komplett ueberarbeitet und neues Reminders-Plugin erstellt. Dazu Standalone Follow-Up-Bruecke und Recording-Config-Override implementiert.
Phase 1 — Infrastruktur:
trixy_core/wakeword/service.py: recording_config_override Event-Handler — Plugins koennen Silence-Timeout und Max-Recording temporaer aendern. Werte werden in _complete_session() automatisch zurueckgesetzt.trixy_core/standalone.py: _setup_standalone_followup() — Bruecke fuer followup_expected Event → WakewordService _handle_follow_up(). Ermoeglicht Multi-Turn-Dialoge im Standalone-Modus mit Sprachaufnahme.Phase 2 — Notes-Plugin v2.0 (plugins/notes/):
./sync_data/notes.note/{item_id}.pcmPhase 3 — Reminders-Plugin (plugins/reminders/):
time_parser.py): "morgen", "in 2 Stunden", "naechsten Montag", "heute Abend", VM/NM-ErkennungNeue Dateien:
plugins/notes/main.py (Rewrite), plugins/notes/config.jsonplugins/reminders/__init__.py, plugins/reminders/main.py, plugins/reminders/config.json, plugins/reminders/time_parser.pyGeaenderte Dateien:
trixy_core/wakeword/service.py — recording_config_override Event + Resettrixy_core/standalone.py — followup_expected BridgeStatus: Abgeschlossen
Beschreibung:
Konfigurierbarer, mehrstufiger STT-Nachkorrektur-Service als IService. Registriert sich mit HIGH-Prioritaet auf speech_recognized und korrigiert Text in-place, bevor das NLP-Plugin (NORMAL-Prioritaet) ihn verarbeitet. Ersetzt die primitive _correct_stt_text() im NLP-Plugin.
Architektur-Entscheidung: Event-Prioritaet statt neues Event. STTCorrectorService nutzt EventPriority.HIGH, NLP-Plugin hat default NORMAL. Korrektur per in-place Modifikation von event_data.text.
6 optionale Korrektur-Schichten:
Jede Schicht graceful skip per try/import. Default-Layers: symspell, phonetic, kenlm.
Neue Dateien:
trixy_core/stt/__init__.py — Paket-Exportstrixy_core/stt/corrector.py — STTCorrectorService (IService)trixy_core/stt/layers/__init__.py — Layer-Registrytrixy_core/stt/layers/base.py — CorrectionLayer ABCtrixy_core/stt/layers/symspell_layer.py — SymSpell-Korrekturtrixy_core/stt/layers/phonetic_layer.py — Cologne Phoneticstrixy_core/stt/layers/kenlm_layer.py — KenLM N-Gramtrixy_core/stt/layers/jamspell_layer.py — JamSpell Neuraltrixy_core/stt/layers/hunspell_layer.py — Hunspell-Woerterbuchtrixy_core/stt/layers/languagetool_layer.py — LanguageTool GrammatikGeaenderte Dateien:
trixy_core/config/datasets/server.py — STTCorrectionConfig Dataclass + Feld in ServerConfigtrixy_core/config/datasets/standalone.py — STTCorrectionConfig Import + Feld in StandaloneConfigconfig/standalone_config.json — stt_correction Abschnittconfig/server_config.json — stt_correction Abschnitttrixy_core/standalone.py — STTCorrectorService erstellt + registrierttrixy_core/server.py — STTCorrectorService erstellt + registriertBeschreibung: Die 4 Schedule Sub-Views (F1-F4 im Schedule-Kontext) waren nur lesend. Jetzt sind alle Views interaktiv mit Eingabefeldern, Typ-Auswahl und dynamischen Formularen.
Geaenderte Dateien:
trixy_core/tui/views/schedule_info_view.py — Input-Felder fuer Name, Beschreibung, Config + Speichern-Buttontrixy_core/tui/views/schedule_trigger_view.py — Typ-Select + dynamische FormField-Widgetstrixy_core/tui/views/schedule_condition_view.py — DataTable + Add/Remove + Edit-Bereich mit dynamischen Felderntrixy_core/tui/views/schedule_action_view.py — DataTable + Add/Remove/Hoch/Runter + Edit-Bereichtrixy_core/tui/app.py — FormMeta-Laden beim Betreten des Schedule-Kontexts + save_schedule_job()trixy_core/tui/css/schedule.tcss — Styles fuer neue Formular-ElementeStatus: Abgeschlossen
Neue Scheduler-Action TTSSpeakAction fuer TTS-Sprachausgabe auf Satellites.
Unterstuetzt Template-Platzhalter ({date.now.hour}, {sys.hostname}, {env.USER}, etc.)
und kann an einen bestimmten Satellite oder alle verbundenen Satellites senden.
Neue Dateien:
trixy_core/utils/template_formatter.py — Platzhalter-System mit date/sys/env/ctx-Namespacestrixy_core/scheduler/action/tts.py — TTSSpeakAction mit FormField-DefinitionenGeaenderte Dateien:
trixy_core/scheduler/action/__init__.py — TTSSpeakAction exportierttrixy_core/scheduler/scheduler.py — In ACTION_TYPES registrierttrixy_core/scheduler/service.py — satellite_manager automatisch in Kontext injiziertStatus: Abgeschlossen
Wakeword-Trainer unterstuetzt nun 7 TTS-Engines statt nur Piper, plus DSP-basiertes Voice-Morphing (8 Presets) und optionale KI-Voice-Cloning. Bug-Fix: abgehackte Enden bei generierten Samples durch Fade-In/Out behoben.
Neue Dateien:
trixy_core/trainer/core/tts_engines/__init__.py — Exports, get_all_engines()trixy_core/trainer/core/tts_engines/base.py — ITTSEngine ABC, TTSVoice, TTSResulttrixy_core/trainer/core/tts_engines/piper_engine.py — PiperTTSEnginetrixy_core/trainer/core/tts_engines/gtts_engine.py — GoogleTranslateTTSEnginetrixy_core/trainer/core/tts_engines/edge_engine.py — EdgeTTSEngine (ThreadPoolExecutor)trixy_core/trainer/core/tts_engines/coqui_engine.py — CoquiTTSEngine (Thorsten)trixy_core/trainer/core/tts_engines/espeak_engine.py — EspeakTTSEnginetrixy_core/trainer/core/tts_engines/bark_engine.py — BarkTTSEngine (GPU)trixy_core/trainer/core/tts_engines/clone_engine.py — VoiceCloningEngine (XTTS/YourTTS)trixy_core/trainer/core/tts_engines/voice_morph.py — DSP Voice-Morphing (VTLP + LPC + Breathiness + Jitter/Shimmer)Geaenderte Dateien:
trixy_core/trainer/core/wakeword_trainer.py — Engine-agnostisch, Voice-Morph, Fade-Fixtrixy_core/tui/views/trainer_optional_view.py — Button-Variant, Schema-Refreshinstall_requirements.sh — --tts-engines Flag