From f45cf794744a42a4df9c9773bf21eaae0deb6f80 Mon Sep 17 00:00:00 2001
From: ValueOn AG
Date: Fri, 23 Jan 2026 07:35:53 +0100
Subject: [PATCH] fixes
---
modules/features/aichat/mainAiChat.py | 166 ++++++++++++++++++++++++++
1 file changed, 166 insertions(+)
create mode 100644 modules/features/aichat/mainAiChat.py
diff --git a/modules/features/aichat/mainAiChat.py b/modules/features/aichat/mainAiChat.py
new file mode 100644
index 00000000..2e6514e6
--- /dev/null
+++ b/modules/features/aichat/mainAiChat.py
@@ -0,0 +1,166 @@
+# Copyright (c) 2025 Patrick Motsch
+# All rights reserved.
+"""
+AIChat Feature Container - Main Module.
+Handles feature initialization and RBAC catalog registration.
+
+AIChat is the dynamic chat workflow feature that handles:
+- AI-powered document processing
+- Dynamic workflow execution
+- Automation definitions
+"""
+
+import logging
+from typing import Dict, List, Any
+
+logger = logging.getLogger(__name__)
+
+# Feature metadata
+FEATURE_CODE = "chatworkflow"
+FEATURE_LABEL = {"en": "Chat Workflow", "de": "Chat-Workflow", "fr": "Workflow de Chat"}
+FEATURE_ICON = "mdi-message-cog"
+
+# UI Objects for RBAC catalog
+UI_OBJECTS = [
+ {
+ "objectKey": "ui.feature.aichat.workflows",
+ "label": {"en": "Workflows", "de": "Workflows", "fr": "Workflows"},
+ "meta": {"area": "workflows"}
+ },
+ {
+ "objectKey": "ui.feature.aichat.automations",
+ "label": {"en": "Automations", "de": "Automatisierungen", "fr": "Automatisations"},
+ "meta": {"area": "automations"}
+ },
+ {
+ "objectKey": "ui.feature.aichat.logs",
+ "label": {"en": "Logs", "de": "Logs", "fr": "Journaux"},
+ "meta": {"area": "logs"}
+ },
+]
+
+# Resource Objects for RBAC catalog
+RESOURCE_OBJECTS = [
+ {
+ "objectKey": "resource.feature.aichat.workflow.start",
+ "label": {"en": "Start Workflow", "de": "Workflow starten", "fr": "Démarrer workflow"},
+ "meta": {"endpoint": "/api/chat/playground/start", "method": "POST"}
+ },
+ {
+ "objectKey": "resource.feature.aichat.workflow.stop",
+ "label": {"en": "Stop Workflow", "de": "Workflow stoppen", "fr": "Arrêter workflow"},
+ "meta": {"endpoint": "/api/chat/playground/stop/{workflowId}", "method": "POST"}
+ },
+ {
+ "objectKey": "resource.feature.aichat.workflow.delete",
+ "label": {"en": "Delete Workflow", "de": "Workflow löschen", "fr": "Supprimer workflow"},
+ "meta": {"endpoint": "/api/chat/playground/workflow/{workflowId}", "method": "DELETE"}
+ },
+]
+
+# Template roles for this feature
+TEMPLATE_ROLES = [
+ {
+ "roleLabel": "workflow-admin",
+ "description": {
+ "en": "Workflow Administrator - Full access to workflow configuration and execution",
+ "de": "Workflow-Administrator - Vollzugriff auf Workflow-Konfiguration und Ausführung",
+ "fr": "Administrateur workflow - Accès complet à la configuration et exécution"
+ }
+ },
+ {
+ "roleLabel": "workflow-editor",
+ "description": {
+ "en": "Workflow Editor - Create and modify workflows",
+ "de": "Workflow-Editor - Workflows erstellen und bearbeiten",
+ "fr": "Éditeur workflow - Créer et modifier les workflows"
+ }
+ },
+ {
+ "roleLabel": "workflow-viewer",
+ "description": {
+ "en": "Workflow Viewer - View workflows and execution results",
+ "de": "Workflow-Betrachter - Workflows und Ausführungsergebnisse einsehen",
+ "fr": "Visualiseur workflow - Consulter les workflows et résultats"
+ }
+ },
+]
+
+
+def getFeatureDefinition() -> Dict[str, Any]:
+ """Return the feature definition for registration."""
+ return {
+ "code": FEATURE_CODE,
+ "label": FEATURE_LABEL,
+ "icon": FEATURE_ICON
+ }
+
+
+def getUiObjects() -> List[Dict[str, Any]]:
+ """Return UI objects for RBAC catalog registration."""
+ return UI_OBJECTS
+
+
+def getResourceObjects() -> List[Dict[str, Any]]:
+ """Return resource objects for RBAC catalog registration."""
+ return RESOURCE_OBJECTS
+
+
+def getTemplateRoles() -> List[Dict[str, Any]]:
+ """Return template roles for this feature."""
+ return TEMPLATE_ROLES
+
+
+def registerFeature(catalogService) -> bool:
+ """
+ Register this feature's RBAC objects in the catalog.
+
+ Args:
+ catalogService: The RBAC catalog service instance
+
+ Returns:
+ True if registration was successful
+ """
+ try:
+ # Register UI objects
+ for uiObj in UI_OBJECTS:
+ catalogService.registerUiObject(
+ featureCode=FEATURE_CODE,
+ objectKey=uiObj["objectKey"],
+ label=uiObj["label"],
+ meta=uiObj.get("meta")
+ )
+
+ # Register Resource objects
+ for resObj in RESOURCE_OBJECTS:
+ catalogService.registerResourceObject(
+ featureCode=FEATURE_CODE,
+ objectKey=resObj["objectKey"],
+ label=resObj["label"],
+ meta=resObj.get("meta")
+ )
+
+ logger.info(f"Feature '{FEATURE_CODE}' registered {len(UI_OBJECTS)} UI objects and {len(RESOURCE_OBJECTS)} resource objects")
+ return True
+
+ except Exception as e:
+ logger.error(f"Failed to register feature '{FEATURE_CODE}': {e}")
+ return False
+
+
+async def onStart(eventUser) -> None:
+ """
+ Called when the feature container starts.
+ Initializes AI connectors for model registry.
+ """
+ try:
+ from modules.aicore.aicoreModelRegistry import modelRegistry
+ modelRegistry.ensureConnectorsRegistered()
+ logger.info(f"Feature '{FEATURE_CODE}' started - AI connectors initialized")
+ except Exception as e:
+ logger.error(f"Feature '{FEATURE_CODE}' failed to initialize AI connectors: {e}")
+
+
+async def onStop(eventUser) -> None:
+ """Called when the feature container stops."""
+ logger.info(f"Feature '{FEATURE_CODE}' stopped")