From 77151df0f433c02e7914bddc863d1406719f3674 Mon Sep 17 00:00:00 2001
From: patrick-motsch
Date: Fri, 13 Feb 2026 18:03:23 +0100
Subject: [PATCH] fix: STT audioFormat scoping, automation import name, orphan
FK cleanup
Co-authored-by: Cursor
---
modules/connectors/connectorVoiceGoogle.py | 3 +++
modules/features/automation/mainAutomation.py | 4 ++--
modules/shared/dbMultiTenantOptimizations.py | 16 ++++++++++++++++
3 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/modules/connectors/connectorVoiceGoogle.py b/modules/connectors/connectorVoiceGoogle.py
index b9d9bf2c..c32b7fa4 100644
--- a/modules/connectors/connectorVoiceGoogle.py
+++ b/modules/connectors/connectorVoiceGoogle.py
@@ -86,6 +86,9 @@ class ConnectorGoogleSpeech:
channels = validation["channels"]
audioFormat = validation["format"]
logger.info(f"Auto-detected audio: {audioFormat}, {sampleRate}Hz, {channels}ch")
+ else:
+ # When sampleRate and channels are explicitly provided, assume raw PCM (LINEAR16)
+ audioFormat = "linear16"
logger.info(f"Processing audio with Google Cloud Speech-to-Text")
logger.info(f"Audio: {len(audioContent)} bytes, {sampleRate}Hz, {channels}ch")
diff --git a/modules/features/automation/mainAutomation.py b/modules/features/automation/mainAutomation.py
index 503e7b41..e23b320f 100644
--- a/modules/features/automation/mainAutomation.py
+++ b/modules/features/automation/mainAutomation.py
@@ -301,12 +301,12 @@ def _migrateExistingTemplates() -> None:
as system templates (isSystem=True). This runs idempotently during feature registration.
"""
try:
- from modules.features.automation.interfaceFeatureAutomation import getAutomationInterface
+ from modules.features.automation.interfaceFeatureAutomation import getInterface
from modules.security.rootAccess import getRootUser
from modules.features.automation.datamodelFeatureAutomation import AutomationTemplate
rootUser = getRootUser()
- automationInterface = getAutomationInterface(rootUser)
+ automationInterface = getInterface(rootUser)
# Get all templates from DB
allTemplates = automationInterface.db.getRecordset(AutomationTemplate)
diff --git a/modules/shared/dbMultiTenantOptimizations.py b/modules/shared/dbMultiTenantOptimizations.py
index ff8d7e8f..f3c2de98 100644
--- a/modules/shared/dbMultiTenantOptimizations.py
+++ b/modules/shared/dbMultiTenantOptimizations.py
@@ -390,6 +390,22 @@ def _applyForeignKeys(cursor, tables: Optional[List[str]]) -> int:
logger.warning(f"Failed to drop FK {constraintName}: {e}")
continue
+ # Clean up orphaned rows before applying FK constraint
+ try:
+ cursor.execute(f"""
+ DELETE FROM "{tableName}"
+ WHERE "{column}" IS NOT NULL
+ AND "{column}" NOT IN (SELECT "id" FROM "{refTable}")
+ """)
+ orphanCount = cursor.rowcount
+ if orphanCount > 0:
+ logger.info(
+ f"Cleaned {orphanCount} orphaned row(s) from {tableName} "
+ f"(missing {refTable} reference via {column})"
+ )
+ except Exception as e:
+ logger.warning(f"Failed to clean orphans for FK {constraintName}: {e}")
+
try:
cursor.execute(f"""
ALTER TABLE "{tableName}"