diff --git a/app.py b/app.py index 6944b144..6581065b 100644 --- a/app.py +++ b/app.py @@ -19,8 +19,9 @@ from datetime import datetime from modules.shared.configuration import APP_CONFIG from modules.shared.eventManagement import eventManager -from modules.features import featuresLifecycle as featuresLifecycle +from modules.workflows.automation import subAutomationSchedule from modules.interfaces.interfaceDbApp import getRootInterface +from modules.features.featureRegistry import loadFeatureMainModules class DailyRotatingFileHandler(RotatingFileHandler): """ @@ -282,18 +283,27 @@ instanceLabel = APP_CONFIG.get("APP_ENV_LABEL") async def lifespan(app: FastAPI): logger.info("Application is starting up") - # Initialize AI connectors once at startup to avoid per-request discovery - from modules.aicore.aicoreModelRegistry import modelRegistry - modelRegistry.ensureConnectorsRegistered() - # Get event user for feature lifecycle (system-level user for background operations) rootInterface = getRootInterface() eventUser = rootInterface.getUserByUsername("event") if not eventUser: logger.error("Could not get event user - some features may not start properly") + # --- Init Feature Containers (Plug&Play) --- + try: + mainModules = loadFeatureMainModules() + for featureName, module in mainModules.items(): + if hasattr(module, "onStart"): + try: + await module.onStart(eventUser) + logger.info(f"Feature '{featureName}' started") + except Exception as e: + logger.error(f"Feature '{featureName}' failed to start: {e}") + except Exception as e: + logger.warning(f"Could not initialize feature containers: {e}") + # --- Init Managers --- - await featuresLifecycle.start(eventUser) + await subAutomationSchedule.start(eventUser) # Automation scheduler eventManager.start() # Register audit log cleanup scheduler @@ -304,7 +314,21 @@ async def lifespan(app: FastAPI): # --- Stop Managers --- eventManager.stop() - await featuresLifecycle.stop(eventUser) + await subAutomationSchedule.stop(eventUser) # Automation scheduler + + # --- Stop Feature Containers (Plug&Play) --- + try: + mainModules = loadFeatureMainModules() + for featureName, module in mainModules.items(): + if hasattr(module, "onStop"): + try: + await module.onStop(eventUser) + logger.info(f"Feature '{featureName}' stopped") + except Exception as e: + logger.error(f"Feature '{featureName}' failed to stop: {e}") + except Exception as e: + logger.warning(f"Could not shutdown feature containers: {e}") + logger.info("Application has been shut down") @@ -412,9 +436,6 @@ app.include_router(userRouter) from modules.routes.routeDataFiles import router as fileRouter app.include_router(fileRouter) -from modules.routes.routeFeatureNeutralization import router as neutralizationRouter -app.include_router(neutralizationRouter) - from modules.routes.routeDataPrompts import router as promptRouter app.include_router(promptRouter) @@ -424,12 +445,6 @@ app.include_router(connectionsRouter) from modules.routes.routeDataWorkflows import router as dataWorkflowsRouter app.include_router(dataWorkflowsRouter) -from modules.routes.routeFeatureChatDynamic import router as chatPlaygroundRouter -app.include_router(chatPlaygroundRouter) - -from modules.routes.routeFeatureRealEstate import router as realEstateRouter -app.include_router(realEstateRouter) - from modules.routes.routeSecurityLocal import router as localRouter app.include_router(localRouter) @@ -448,27 +463,15 @@ app.include_router(adminSecurityRouter) from modules.routes.routeSharepoint import router as sharepointRouter app.include_router(sharepointRouter) -from modules.routes.routeDataAutomation import router as automationRouter -app.include_router(automationRouter) - from modules.routes.routeAdminAutomationEvents import router as adminAutomationEventsRouter app.include_router(adminAutomationEventsRouter) from modules.routes.routeAdminRbacRules import router as rbacAdminRulesRouter app.include_router(rbacAdminRulesRouter) -from modules.routes.routeOptions import router as optionsRouter -app.include_router(optionsRouter) - from modules.routes.routeMessaging import router as messagingRouter app.include_router(messagingRouter) -from modules.routes.routeFeatureChatbot import router as chatbotRouter -app.include_router(chatbotRouter) - -from modules.routes.routeFeatureTrustee import router as trusteeRouter -app.include_router(trusteeRouter) - # Phase 8: New Feature Routes from modules.routes.routeAdminFeatures import router as featuresAdminRouter app.include_router(featuresAdminRouter) @@ -481,3 +484,12 @@ app.include_router(rbacAdminExportRouter) from modules.routes.routeGdpr import router as gdprRouter app.include_router(gdprRouter) + +# ============================================================================ +# PLUG&PLAY FEATURE ROUTERS +# Dynamically load routers from feature containers in modules/features/ +# ============================================================================ +from modules.features.featureRegistry import loadFeatureRouters + +featureLoadResults = loadFeatureRouters(app) +logger.info(f"Feature router load results: {featureLoadResults}") diff --git a/modules/datamodels/datamodelWorkflow.py b/modules/datamodels/datamodelWorkflow.py index b884382c..1a1e49e8 100644 --- a/modules/datamodels/datamodelWorkflow.py +++ b/modules/datamodels/datamodelWorkflow.py @@ -12,12 +12,6 @@ from modules.shared.jsonUtils import extractJsonString, tryParseJson, repairBrok # Import DocumentReferenceList at runtime (needed for ActionDefinition) from modules.datamodels.datamodelDocref import DocumentReferenceList -# Forward references for circular imports (use string annotations) -if TYPE_CHECKING: - from modules.datamodels.datamodelChat import ChatDocument, ActionResult - from modules.datamodels.datamodelExtraction import ExtractionOptions - - class ActionDefinition(BaseModel): """Action definition with selection and parameters from planning phase""" diff --git a/modules/aicore/aicoreBase.py b/modules/features/aichat/aicore/aicoreBase.py similarity index 100% rename from modules/aicore/aicoreBase.py rename to modules/features/aichat/aicore/aicoreBase.py diff --git a/modules/aicore/aicoreModelRegistry.py b/modules/features/aichat/aicore/aicoreModelRegistry.py similarity index 99% rename from modules/aicore/aicoreModelRegistry.py rename to modules/features/aichat/aicore/aicoreModelRegistry.py index ed82572d..8fd0e284 100644 --- a/modules/aicore/aicoreModelRegistry.py +++ b/modules/features/aichat/aicore/aicoreModelRegistry.py @@ -10,7 +10,7 @@ import importlib import os from typing import Dict, List, Optional, Any from modules.datamodels.datamodelAi import AiModel -from modules.aicore.aicoreBase import BaseConnectorAi +from .aicoreBase import BaseConnectorAi from modules.datamodels.datamodelUam import User from modules.security.rbacHelpers import checkResourceAccess from modules.security.rbac import RbacClass diff --git a/modules/aicore/aicoreModelSelector.py b/modules/features/aichat/aicore/aicoreModelSelector.py similarity index 100% rename from modules/aicore/aicoreModelSelector.py rename to modules/features/aichat/aicore/aicoreModelSelector.py diff --git a/modules/aicore/aicorePluginAnthropic.py b/modules/features/aichat/aicore/aicorePluginAnthropic.py similarity index 99% rename from modules/aicore/aicorePluginAnthropic.py rename to modules/features/aichat/aicore/aicorePluginAnthropic.py index 2a619056..0d80aeaa 100644 --- a/modules/aicore/aicorePluginAnthropic.py +++ b/modules/features/aichat/aicore/aicorePluginAnthropic.py @@ -6,7 +6,7 @@ import os from typing import Dict, Any, List from fastapi import HTTPException from modules.shared.configuration import APP_CONFIG -from modules.aicore.aicoreBase import BaseConnectorAi +from .aicoreBase import BaseConnectorAi from modules.datamodels.datamodelAi import AiModel, PriorityEnum, ProcessingModeEnum, OperationTypeEnum, AiModelCall, AiModelResponse, createOperationTypeRatings # Configure logger diff --git a/modules/aicore/aicorePluginInternal.py b/modules/features/aichat/aicore/aicorePluginInternal.py similarity index 98% rename from modules/aicore/aicorePluginInternal.py rename to modules/features/aichat/aicore/aicorePluginInternal.py index f8e13e16..1b73c27e 100644 --- a/modules/aicore/aicorePluginInternal.py +++ b/modules/features/aichat/aicore/aicorePluginInternal.py @@ -2,7 +2,7 @@ # All rights reserved. import logging from typing import List -from modules.aicore.aicoreBase import BaseConnectorAi +from .aicoreBase import BaseConnectorAi from modules.datamodels.datamodelAi import AiModel, PriorityEnum, ProcessingModeEnum, OperationTypeEnum, AiModelCall, AiModelResponse, createOperationTypeRatings # Configure logger diff --git a/modules/aicore/aicorePluginOpenai.py b/modules/features/aichat/aicore/aicorePluginOpenai.py similarity index 99% rename from modules/aicore/aicorePluginOpenai.py rename to modules/features/aichat/aicore/aicorePluginOpenai.py index 932586e6..711f0c35 100644 --- a/modules/aicore/aicorePluginOpenai.py +++ b/modules/features/aichat/aicore/aicorePluginOpenai.py @@ -5,7 +5,7 @@ import httpx from typing import List from fastapi import HTTPException from modules.shared.configuration import APP_CONFIG -from modules.aicore.aicoreBase import BaseConnectorAi +from .aicoreBase import BaseConnectorAi from modules.datamodels.datamodelAi import AiModel, PriorityEnum, ProcessingModeEnum, OperationTypeEnum, AiModelCall, AiModelResponse, createOperationTypeRatings # Configure logger diff --git a/modules/aicore/aicorePluginPerplexity.py b/modules/features/aichat/aicore/aicorePluginPerplexity.py similarity index 99% rename from modules/aicore/aicorePluginPerplexity.py rename to modules/features/aichat/aicore/aicorePluginPerplexity.py index e129b047..f537d83c 100644 --- a/modules/aicore/aicorePluginPerplexity.py +++ b/modules/features/aichat/aicore/aicorePluginPerplexity.py @@ -5,7 +5,7 @@ import httpx from typing import List from fastapi import HTTPException from modules.shared.configuration import APP_CONFIG -from modules.aicore.aicoreBase import BaseConnectorAi +from .aicoreBase import BaseConnectorAi from modules.datamodels.datamodelAi import AiModel, PriorityEnum, ProcessingModeEnum, OperationTypeEnum, AiModelCall, AiModelResponse, createOperationTypeRatings, AiCallPromptWebSearch, AiCallPromptWebCrawl from modules.datamodels.datamodelTools import CountryCodes diff --git a/modules/aicore/aicorePluginTavily.py b/modules/features/aichat/aicore/aicorePluginTavily.py similarity index 99% rename from modules/aicore/aicorePluginTavily.py rename to modules/features/aichat/aicore/aicorePluginTavily.py index 1a5cbc65..1d2ece75 100644 --- a/modules/aicore/aicorePluginTavily.py +++ b/modules/features/aichat/aicore/aicorePluginTavily.py @@ -10,7 +10,7 @@ from dataclasses import dataclass from typing import Optional, List, Dict from tavily import AsyncTavilyClient from modules.shared.configuration import APP_CONFIG -from modules.aicore.aicoreBase import BaseConnectorAi +from .aicoreBase import BaseConnectorAi from modules.datamodels.datamodelAi import AiModel, PriorityEnum, ProcessingModeEnum, OperationTypeEnum, AiModelCall, AiModelResponse, createOperationTypeRatings, AiCallPromptWebSearch, AiCallPromptWebCrawl from modules.datamodels.datamodelTools import CountryCodes diff --git a/modules/datamodels/datamodelChat.py b/modules/features/aichat/datamodelFeatureAiChat.py similarity index 100% rename from modules/datamodels/datamodelChat.py rename to modules/features/aichat/datamodelFeatureAiChat.py diff --git a/modules/interfaces/interfaceDbChat.py b/modules/features/aichat/interfaceFeatureAiChat.py similarity index 97% rename from modules/interfaces/interfaceDbChat.py rename to modules/features/aichat/interfaceFeatureAiChat.py index d171c2ca..de3d42d1 100644 --- a/modules/interfaces/interfaceDbChat.py +++ b/modules/features/aichat/interfaceFeatureAiChat.py @@ -16,7 +16,7 @@ from modules.security.rbac import RbacClass from modules.datamodels.datamodelRbac import AccessRuleContext from modules.datamodels.datamodelUam import AccessLevel -from modules.datamodels.datamodelChat import ( +from .datamodelFeatureAiChat import ( ChatDocument, ChatStat, ChatLog, @@ -1095,26 +1095,6 @@ class ChatObjects: actionName=createdMessage.get("actionName") ) - # Emit message event for streaming (if event manager is available) - try: - from modules.features.chatbot.eventManager import get_event_manager - event_manager = get_event_manager() - message_timestamp = parseTimestamp(chat_message.publishedAt, default=getUtcTimestamp()) - # Emit message event in exact chatData format: {type, createdAt, item} - asyncio.create_task(event_manager.emit_event( - context_id=workflowId, - event_type="chatdata", - data={ - "type": "message", - "createdAt": message_timestamp, - "item": chat_message.dict() - }, - event_category="chat" - )) - except Exception as e: - # Event manager not available or error - continue without emitting - logger.debug(f"Could not emit message event: {e}") - # Debug: Store message and documents for debugging - only if debug enabled storeDebugMessageAndDocuments(chat_message, self.currentUser) @@ -1481,29 +1461,6 @@ class ChatObjects: # Create log in normalized table createdLog = self.db.recordCreate(ChatLog, log_model) - # Emit log event for streaming (only for chatbot workflows) - # Only emit events for chatbot workflows, not for automation or dynamic workflows - if workflow.workflowMode == WorkflowModeEnum.WORKFLOW_CHATBOT: - try: - from modules.features.chatbot.eventManager import get_event_manager - event_manager = get_event_manager() - log_timestamp = parseTimestamp(createdLog.get("timestamp"), default=getUtcTimestamp()) - # Emit log event in exact chatData format: {type, createdAt, item} - asyncio.create_task(event_manager.emit_event( - workflowId, - "chatdata", - "New log", - "log", - { - "type": "log", - "createdAt": log_timestamp, - "item": ChatLog(**createdLog).model_dump() - } - )) - except Exception as e: - # Event manager not available or error - continue without emitting - logger.debug(f"Could not emit log event: {e}") - # Return validated ChatLog instance return ChatLog(**createdLog) @@ -1888,14 +1845,6 @@ class ChatObjects: if not self.checkRbacPermission(AutomationDefinition, "delete", automationId): raise PermissionError(f"No permission to delete automation {automationId}") - # Remove event if exists - if existing.get("eventId"): - from modules.shared.eventManagement import eventManager - try: - eventManager.remove(existing["eventId"]) - except Exception as e: - logger.warning(f"Error removing event {existing['eventId']}: {str(e)}") - # Delete automation from database self.db.recordDelete(AutomationDefinition, automationId) diff --git a/modules/features/aichat/mainAiChat.py b/modules/features/aichat/mainAiChat.py new file mode 100644 index 00000000..fbd6b91a --- /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 .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") diff --git a/modules/routes/routeFeatureChatDynamic.py b/modules/features/aichat/routeFeatureAiChat.py similarity index 95% rename from modules/routes/routeFeatureChatDynamic.py rename to modules/features/aichat/routeFeatureAiChat.py index 5be544a8..3eaaf624 100644 --- a/modules/routes/routeFeatureChatDynamic.py +++ b/modules/features/aichat/routeFeatureAiChat.py @@ -13,13 +13,13 @@ from fastapi import APIRouter, HTTPException, Depends, Body, Path, Query, Reques from modules.auth import limiter, getRequestContext, RequestContext # Import interfaces -import modules.interfaces.interfaceDbChat as interfaceDbChat +from . import interfaceFeatureAiChat as interfaceDbChat # Import models -from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum +from .datamodelFeatureAiChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum # Import workflow control functions -from modules.features.workflow import chatStart, chatStop +from modules.workflows.automation import chatStart, chatStop # Configure logger logger = logging.getLogger(__name__) diff --git a/modules/services/serviceAi/mainServiceAi.py b/modules/features/aichat/serviceAi/mainServiceAi.py similarity index 97% rename from modules/services/serviceAi/mainServiceAi.py rename to modules/features/aichat/serviceAi/mainServiceAi.py index cd86c6a8..e5d2605f 100644 --- a/modules/services/serviceAi/mainServiceAi.py +++ b/modules/features/aichat/serviceAi/mainServiceAi.py @@ -6,8 +6,8 @@ import re import time import base64 from typing import Dict, Any, List, Optional, Tuple -from modules.datamodels.datamodelChat import PromptPlaceholder, ChatDocument -from modules.services.serviceExtraction.mainServiceExtraction import ExtractionService +from modules.features.aichat.datamodelFeatureAiChat import PromptPlaceholder, ChatDocument +from modules.features.aichat.serviceExtraction.mainServiceExtraction import ExtractionService from modules.datamodels.datamodelAi import AiCallRequest, AiCallOptions, OperationTypeEnum, PriorityEnum, ProcessingModeEnum from modules.datamodels.datamodelExtraction import ContentPart, DocumentIntent from modules.datamodels.datamodelWorkflow import AiResponse, AiResponseMetadata, DocumentData @@ -16,7 +16,7 @@ from modules.interfaces.interfaceAiObjects import AiObjects from modules.shared.jsonUtils import ( parseJsonWithModel ) -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler +from .subJsonResponseHandling import JsonResponseHandler from modules.datamodels.datamodelAi import JsonAccumulationState logger = logging.getLogger(__name__) @@ -49,12 +49,12 @@ class AiService: self.extractionService = ExtractionService(self.services) # Initialize new submodules - from modules.services.serviceAi.subResponseParsing import ResponseParser - from modules.services.serviceAi.subDocumentIntents import DocumentIntentAnalyzer - from modules.services.serviceAi.subContentExtraction import ContentExtractor - from modules.services.serviceAi.subStructureGeneration import StructureGenerator - from modules.services.serviceAi.subStructureFilling import StructureFiller - from modules.services.serviceAi.subAiCallLooping import AiCallLooper + from .subResponseParsing import ResponseParser + from .subDocumentIntents import DocumentIntentAnalyzer + from .subContentExtraction import ContentExtractor + from .subStructureGeneration import StructureGenerator + from .subStructureFilling import StructureFiller + from .subAiCallLooping import AiCallLooper if not hasattr(self, 'responseParser'): logger.info("Initializing ResponseParser...") @@ -329,7 +329,7 @@ Respond with ONLY a JSON object in this exact format: parentOperationId: Optional[str] ) -> AiResponse: """Handle IMAGE_GENERATE operation type using image generation path.""" - from modules.services.serviceGeneration.paths.imagePath import ImageGenerationPath + from modules.features.aichat.serviceGeneration.paths.imagePath import ImageGenerationPath imagePath = ImageGenerationPath(self.services) @@ -514,7 +514,7 @@ Respond with ONLY a JSON object in this exact format: ) try: - from modules.services.serviceGeneration.mainServiceGeneration import GenerationService + from modules.features.aichat.serviceGeneration.mainServiceGeneration import GenerationService generationService = GenerationService(self.services) @@ -829,7 +829,7 @@ Respond with ONLY a JSON object in this exact format: parentOperationId: Optional[str] ) -> AiResponse: """Handle code generation using code generation path.""" - from modules.services.serviceGeneration.paths.codePath import CodeGenerationPath + from modules.features.aichat.serviceGeneration.paths.codePath import CodeGenerationPath codePath = CodeGenerationPath(self.services) return await codePath.generateCode( @@ -852,7 +852,7 @@ Respond with ONLY a JSON object in this exact format: parentOperationId: Optional[str] ) -> AiResponse: """Handle document generation using document generation path.""" - from modules.services.serviceGeneration.paths.documentPath import DocumentGenerationPath + from modules.features.aichat.serviceGeneration.paths.documentPath import DocumentGenerationPath # Set compression options for document generation options.compressPrompt = False diff --git a/modules/services/serviceAi/merge_1.txt b/modules/features/aichat/serviceAi/merge_1.txt similarity index 100% rename from modules/services/serviceAi/merge_1.txt rename to modules/features/aichat/serviceAi/merge_1.txt diff --git a/modules/services/serviceAi/subAiCallLooping-flow.md b/modules/features/aichat/serviceAi/subAiCallLooping-flow.md similarity index 100% rename from modules/services/serviceAi/subAiCallLooping-flow.md rename to modules/features/aichat/serviceAi/subAiCallLooping-flow.md diff --git a/modules/services/serviceAi/subAiCallLooping.py b/modules/features/aichat/serviceAi/subAiCallLooping.py similarity index 99% rename from modules/services/serviceAi/subAiCallLooping.py rename to modules/features/aichat/serviceAi/subAiCallLooping.py index 6427b2e0..5f3fb79f 100644 --- a/modules/services/serviceAi/subAiCallLooping.py +++ b/modules/features/aichat/serviceAi/subAiCallLooping.py @@ -53,8 +53,8 @@ from modules.datamodels.datamodelAi import ( AiCallRequest, AiCallOptions ) from modules.datamodels.datamodelExtraction import ContentPart -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler -from modules.services.serviceAi.subLoopingUseCases import LoopingUseCaseRegistry +from .subJsonResponseHandling import JsonResponseHandler +from .subLoopingUseCases import LoopingUseCaseRegistry from modules.workflows.processing.shared.stateTools import checkWorkflowStopped from modules.shared.jsonContinuation import getContexts from modules.shared.jsonUtils import buildContinuationContext, extractJsonString, tryParseJson diff --git a/modules/services/serviceAi/subContentExtraction.py b/modules/features/aichat/serviceAi/subContentExtraction.py similarity index 99% rename from modules/services/serviceAi/subContentExtraction.py rename to modules/features/aichat/serviceAi/subContentExtraction.py index a866f68f..cace339d 100644 --- a/modules/services/serviceAi/subContentExtraction.py +++ b/modules/features/aichat/serviceAi/subContentExtraction.py @@ -14,7 +14,7 @@ import logging import base64 from typing import Dict, Any, List, Optional -from modules.datamodels.datamodelChat import ChatDocument +from modules.features.aichat.datamodelFeatureAiChat import ChatDocument from modules.datamodels.datamodelExtraction import ContentPart, DocumentIntent from modules.workflows.processing.shared.stateTools import checkWorkflowStopped diff --git a/modules/services/serviceAi/subDocumentIntents.py b/modules/features/aichat/serviceAi/subDocumentIntents.py similarity index 99% rename from modules/services/serviceAi/subDocumentIntents.py rename to modules/features/aichat/serviceAi/subDocumentIntents.py index 821851a4..2d45179a 100644 --- a/modules/services/serviceAi/subDocumentIntents.py +++ b/modules/features/aichat/serviceAi/subDocumentIntents.py @@ -12,7 +12,7 @@ import json import logging from typing import Dict, Any, List, Optional -from modules.datamodels.datamodelChat import ChatDocument +from modules.features.aichat.datamodelFeatureAiChat import ChatDocument from modules.datamodels.datamodelExtraction import DocumentIntent from modules.workflows.processing.shared.stateTools import checkWorkflowStopped diff --git a/modules/services/serviceAi/subJsonMerger.py b/modules/features/aichat/serviceAi/subJsonMerger.py similarity index 100% rename from modules/services/serviceAi/subJsonMerger.py rename to modules/features/aichat/serviceAi/subJsonMerger.py diff --git a/modules/services/serviceAi/subJsonResponseHandling.py b/modules/features/aichat/serviceAi/subJsonResponseHandling.py similarity index 99% rename from modules/services/serviceAi/subJsonResponseHandling.py rename to modules/features/aichat/serviceAi/subJsonResponseHandling.py index c088d598..b2cfe084 100644 --- a/modules/services/serviceAi/subJsonResponseHandling.py +++ b/modules/features/aichat/serviceAi/subJsonResponseHandling.py @@ -1346,7 +1346,7 @@ class JsonResponseHandler: # Use new modular merger try: - from modules.services.serviceAi.subJsonMerger import ModularJsonMerger + from .subJsonMerger import ModularJsonMerger result, hasOverlap = ModularJsonMerger.merge(accumulated, newFragment) # IMPORTANT: ModularJsonMerger returns unclosed JSON if overlap found (with incomplete element at end) # If no overlap, returns closed JSON (iterations should stop) diff --git a/modules/services/serviceAi/subLoopingUseCases.py b/modules/features/aichat/serviceAi/subLoopingUseCases.py similarity index 100% rename from modules/services/serviceAi/subLoopingUseCases.py rename to modules/features/aichat/serviceAi/subLoopingUseCases.py diff --git a/modules/services/serviceAi/subResponseParsing.py b/modules/features/aichat/serviceAi/subResponseParsing.py similarity index 99% rename from modules/services/serviceAi/subResponseParsing.py rename to modules/features/aichat/serviceAi/subResponseParsing.py index a2d568d9..68c123ac 100644 --- a/modules/services/serviceAi/subResponseParsing.py +++ b/modules/features/aichat/serviceAi/subResponseParsing.py @@ -15,7 +15,7 @@ import logging from typing import Dict, Any, List, Optional, Tuple from modules.shared.jsonUtils import extractJsonString, repairBrokenJson, extractSectionsFromDocument -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler +from .subJsonResponseHandling import JsonResponseHandler from modules.datamodels.datamodelAi import JsonAccumulationState logger = logging.getLogger(__name__) diff --git a/modules/services/serviceAi/subStructureFilling.py b/modules/features/aichat/serviceAi/subStructureFilling.py similarity index 99% rename from modules/services/serviceAi/subStructureFilling.py rename to modules/features/aichat/serviceAi/subStructureFilling.py index 5145ad54..c5ba2f8a 100644 --- a/modules/services/serviceAi/subStructureFilling.py +++ b/modules/features/aichat/serviceAi/subStructureFilling.py @@ -2531,7 +2531,7 @@ CRITICAL: List of accepted section content types (e.g., ["table", "code_block"]) """ try: - from modules.services.serviceGeneration.renderers.registry import getRenderer + from modules.features.aichat.serviceGeneration.renderers.registry import getRenderer # Get renderer for this format renderer = getRenderer(outputFormat, self.services) diff --git a/modules/services/serviceAi/subStructureGeneration.py b/modules/features/aichat/serviceAi/subStructureGeneration.py similarity index 99% rename from modules/services/serviceAi/subStructureGeneration.py rename to modules/features/aichat/serviceAi/subStructureGeneration.py index 64624b84..ff01c3dd 100644 --- a/modules/services/serviceAi/subStructureGeneration.py +++ b/modules/features/aichat/serviceAi/subStructureGeneration.py @@ -231,7 +231,7 @@ CRITICAL: raise ValueError("Structure has no documents - cannot generate without documents") # Import renderer registry for format validation (existing infrastructure) - from modules.services.serviceGeneration.renderers.registry import getRenderer + from modules.features.aichat.serviceGeneration.renderers.registry import getRenderer # Validate and fix each document for doc in documents: diff --git a/modules/services/serviceExtraction/__init__.py b/modules/features/aichat/serviceExtraction/__init__.py similarity index 100% rename from modules/services/serviceExtraction/__init__.py rename to modules/features/aichat/serviceExtraction/__init__.py diff --git a/modules/services/serviceExtraction/chunking/__init__.py b/modules/features/aichat/serviceExtraction/chunking/__init__.py similarity index 100% rename from modules/services/serviceExtraction/chunking/__init__.py rename to modules/features/aichat/serviceExtraction/chunking/__init__.py diff --git a/modules/services/serviceExtraction/chunking/chunkerImage.py b/modules/features/aichat/serviceExtraction/chunking/chunkerImage.py similarity index 100% rename from modules/services/serviceExtraction/chunking/chunkerImage.py rename to modules/features/aichat/serviceExtraction/chunking/chunkerImage.py diff --git a/modules/services/serviceExtraction/chunking/chunkerStructure.py b/modules/features/aichat/serviceExtraction/chunking/chunkerStructure.py similarity index 100% rename from modules/services/serviceExtraction/chunking/chunkerStructure.py rename to modules/features/aichat/serviceExtraction/chunking/chunkerStructure.py diff --git a/modules/services/serviceExtraction/chunking/chunkerTable.py b/modules/features/aichat/serviceExtraction/chunking/chunkerTable.py similarity index 100% rename from modules/services/serviceExtraction/chunking/chunkerTable.py rename to modules/features/aichat/serviceExtraction/chunking/chunkerTable.py diff --git a/modules/services/serviceExtraction/chunking/chunkerText.py b/modules/features/aichat/serviceExtraction/chunking/chunkerText.py similarity index 100% rename from modules/services/serviceExtraction/chunking/chunkerText.py rename to modules/features/aichat/serviceExtraction/chunking/chunkerText.py diff --git a/modules/services/serviceExtraction/extractors/__init__.py b/modules/features/aichat/serviceExtraction/extractors/__init__.py similarity index 100% rename from modules/services/serviceExtraction/extractors/__init__.py rename to modules/features/aichat/serviceExtraction/extractors/__init__.py diff --git a/modules/services/serviceExtraction/extractors/extractorBinary.py b/modules/features/aichat/serviceExtraction/extractors/extractorBinary.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorBinary.py rename to modules/features/aichat/serviceExtraction/extractors/extractorBinary.py diff --git a/modules/services/serviceExtraction/extractors/extractorCsv.py b/modules/features/aichat/serviceExtraction/extractors/extractorCsv.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorCsv.py rename to modules/features/aichat/serviceExtraction/extractors/extractorCsv.py diff --git a/modules/services/serviceExtraction/extractors/extractorDocx.py b/modules/features/aichat/serviceExtraction/extractors/extractorDocx.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorDocx.py rename to modules/features/aichat/serviceExtraction/extractors/extractorDocx.py diff --git a/modules/services/serviceExtraction/extractors/extractorHtml.py b/modules/features/aichat/serviceExtraction/extractors/extractorHtml.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorHtml.py rename to modules/features/aichat/serviceExtraction/extractors/extractorHtml.py diff --git a/modules/services/serviceExtraction/extractors/extractorImage.py b/modules/features/aichat/serviceExtraction/extractors/extractorImage.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorImage.py rename to modules/features/aichat/serviceExtraction/extractors/extractorImage.py diff --git a/modules/services/serviceExtraction/extractors/extractorJson.py b/modules/features/aichat/serviceExtraction/extractors/extractorJson.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorJson.py rename to modules/features/aichat/serviceExtraction/extractors/extractorJson.py diff --git a/modules/services/serviceExtraction/extractors/extractorPdf.py b/modules/features/aichat/serviceExtraction/extractors/extractorPdf.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorPdf.py rename to modules/features/aichat/serviceExtraction/extractors/extractorPdf.py diff --git a/modules/services/serviceExtraction/extractors/extractorPptx.py b/modules/features/aichat/serviceExtraction/extractors/extractorPptx.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorPptx.py rename to modules/features/aichat/serviceExtraction/extractors/extractorPptx.py diff --git a/modules/services/serviceExtraction/extractors/extractorSql.py b/modules/features/aichat/serviceExtraction/extractors/extractorSql.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorSql.py rename to modules/features/aichat/serviceExtraction/extractors/extractorSql.py diff --git a/modules/services/serviceExtraction/extractors/extractorText.py b/modules/features/aichat/serviceExtraction/extractors/extractorText.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorText.py rename to modules/features/aichat/serviceExtraction/extractors/extractorText.py diff --git a/modules/services/serviceExtraction/extractors/extractorXlsx.py b/modules/features/aichat/serviceExtraction/extractors/extractorXlsx.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorXlsx.py rename to modules/features/aichat/serviceExtraction/extractors/extractorXlsx.py diff --git a/modules/services/serviceExtraction/extractors/extractorXml.py b/modules/features/aichat/serviceExtraction/extractors/extractorXml.py similarity index 100% rename from modules/services/serviceExtraction/extractors/extractorXml.py rename to modules/features/aichat/serviceExtraction/extractors/extractorXml.py diff --git a/modules/services/serviceExtraction/mainServiceExtraction.py b/modules/features/aichat/serviceExtraction/mainServiceExtraction.py similarity index 99% rename from modules/services/serviceExtraction/mainServiceExtraction.py rename to modules/features/aichat/serviceExtraction/mainServiceExtraction.py index 199201eb..abe32352 100644 --- a/modules/services/serviceExtraction/mainServiceExtraction.py +++ b/modules/features/aichat/serviceExtraction/mainServiceExtraction.py @@ -11,10 +11,10 @@ import json from .subRegistry import ExtractorRegistry, ChunkerRegistry from .subPipeline import runExtraction from modules.datamodels.datamodelExtraction import ContentExtracted, ContentPart, MergeStrategy, ExtractionOptions, PartResult, DocumentIntent -from modules.datamodels.datamodelChat import ChatDocument +from modules.features.aichat.datamodelFeatureAiChat import ChatDocument from modules.datamodels.datamodelAi import AiCallResponse, AiCallRequest, AiCallOptions, OperationTypeEnum, AiModelCall -from modules.aicore.aicoreModelRegistry import modelRegistry -from modules.aicore.aicoreModelSelector import modelSelector +from modules.features.aichat.aicore.aicoreModelRegistry import modelRegistry +from modules.features.aichat.aicore.aicoreModelSelector import modelSelector from modules.shared.jsonUtils import stripCodeFences diff --git a/modules/services/serviceExtraction/merging/__init__.py b/modules/features/aichat/serviceExtraction/merging/__init__.py similarity index 100% rename from modules/services/serviceExtraction/merging/__init__.py rename to modules/features/aichat/serviceExtraction/merging/__init__.py diff --git a/modules/services/serviceExtraction/merging/mergerDefault.py b/modules/features/aichat/serviceExtraction/merging/mergerDefault.py similarity index 100% rename from modules/services/serviceExtraction/merging/mergerDefault.py rename to modules/features/aichat/serviceExtraction/merging/mergerDefault.py diff --git a/modules/services/serviceExtraction/merging/mergerTable.py b/modules/features/aichat/serviceExtraction/merging/mergerTable.py similarity index 100% rename from modules/services/serviceExtraction/merging/mergerTable.py rename to modules/features/aichat/serviceExtraction/merging/mergerTable.py diff --git a/modules/services/serviceExtraction/merging/mergerText.py b/modules/features/aichat/serviceExtraction/merging/mergerText.py similarity index 100% rename from modules/services/serviceExtraction/merging/mergerText.py rename to modules/features/aichat/serviceExtraction/merging/mergerText.py diff --git a/modules/services/serviceExtraction/subMerger.py b/modules/features/aichat/serviceExtraction/subMerger.py similarity index 100% rename from modules/services/serviceExtraction/subMerger.py rename to modules/features/aichat/serviceExtraction/subMerger.py diff --git a/modules/services/serviceExtraction/subPipeline.py b/modules/features/aichat/serviceExtraction/subPipeline.py similarity index 100% rename from modules/services/serviceExtraction/subPipeline.py rename to modules/features/aichat/serviceExtraction/subPipeline.py diff --git a/modules/services/serviceExtraction/subPromptBuilderExtraction.py b/modules/features/aichat/serviceExtraction/subPromptBuilderExtraction.py similarity index 98% rename from modules/services/serviceExtraction/subPromptBuilderExtraction.py rename to modules/features/aichat/serviceExtraction/subPromptBuilderExtraction.py index 8f8f756d..50228983 100644 --- a/modules/services/serviceExtraction/subPromptBuilderExtraction.py +++ b/modules/features/aichat/serviceExtraction/subPromptBuilderExtraction.py @@ -13,7 +13,7 @@ from modules.datamodels.datamodelAi import AiCallRequest, AiCallOptions, Operati # Type hint for renderer parameter from typing import TYPE_CHECKING if TYPE_CHECKING: - from modules.services.serviceGeneration.renderers.documentRendererBaseTemplate import BaseRenderer + from modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate import BaseRenderer _RendererLike = BaseRenderer else: _RendererLike = Any diff --git a/modules/services/serviceExtraction/subRegistry.py b/modules/features/aichat/serviceExtraction/subRegistry.py similarity index 99% rename from modules/services/serviceExtraction/subRegistry.py rename to modules/features/aichat/serviceExtraction/subRegistry.py index 32727746..972c1eb7 100644 --- a/modules/services/serviceExtraction/subRegistry.py +++ b/modules/features/aichat/serviceExtraction/subRegistry.py @@ -71,7 +71,7 @@ class ExtractorRegistry: module_name = file_path.stem try: # Import the module - module = importlib.import_module(f".{module_name}", package="modules.services.serviceExtraction.extractors") + module = importlib.import_module(f".{module_name}", package="modules.features.aichat.serviceExtraction.extractors") # Find all extractor classes in the module for attr_name in dir(module): diff --git a/modules/services/serviceExtraction/subUtils.py b/modules/features/aichat/serviceExtraction/subUtils.py similarity index 100% rename from modules/services/serviceExtraction/subUtils.py rename to modules/features/aichat/serviceExtraction/subUtils.py diff --git a/modules/services/serviceGeneration/mainServiceGeneration.py b/modules/features/aichat/serviceGeneration/mainServiceGeneration.py similarity index 98% rename from modules/services/serviceGeneration/mainServiceGeneration.py rename to modules/features/aichat/serviceGeneration/mainServiceGeneration.py index a49b78c7..8aadd081 100644 --- a/modules/services/serviceGeneration/mainServiceGeneration.py +++ b/modules/features/aichat/serviceGeneration/mainServiceGeneration.py @@ -6,8 +6,8 @@ import base64 import traceback from typing import Any, Dict, List, Optional, Callable from modules.datamodels.datamodelDocument import RenderedDocument -from modules.datamodels.datamodelChat import ChatDocument -from modules.services.serviceGeneration.subDocumentUtility import ( +from modules.features.aichat.datamodelFeatureAiChat import ChatDocument +from modules.features.aichat.serviceGeneration.subDocumentUtility import ( getFileExtension, getMimeTypeFromExtension, detectMimeTypeFromContent, @@ -414,7 +414,7 @@ class GenerationService: continue # Check output style classification (code/document/image/etc.) from renderer - from modules.services.serviceGeneration.renderers.registry import getOutputStyle + from modules.features.aichat.serviceGeneration.renderers.registry import getOutputStyle outputStyle = getOutputStyle(docFormat) if outputStyle: logger.debug(f"Document {doc.get('id', docIndex)} format '{docFormat}' classified as '{outputStyle}' style") @@ -471,8 +471,8 @@ class GenerationService: Complete document structure with populated elements ready for rendering """ try: - from modules.services.serviceGeneration.subStructureGenerator import StructureGenerator - from modules.services.serviceGeneration.subContentGenerator import ContentGenerator + from modules.features.aichat.serviceGeneration.subStructureGenerator import StructureGenerator + from modules.features.aichat.serviceGeneration.subContentGenerator import ContentGenerator # Phase 1: Generate structure skeleton if progressCallback: @@ -537,7 +537,7 @@ class GenerationService: aiService=None ) -> str: """Get adaptive extraction prompt.""" - from modules.services.serviceExtraction.subPromptBuilderExtraction import buildExtractionPrompt + from modules.features.aichat.serviceExtraction.subPromptBuilderExtraction import buildExtractionPrompt return await buildExtractionPrompt( outputFormat=outputFormat, userPrompt=userPrompt, diff --git a/modules/services/serviceGeneration/paths/codePath.py b/modules/features/aichat/serviceGeneration/paths/codePath.py similarity index 99% rename from modules/services/serviceGeneration/paths/codePath.py rename to modules/features/aichat/serviceGeneration/paths/codePath.py index f2470385..5e151066 100644 --- a/modules/services/serviceGeneration/paths/codePath.py +++ b/modules/features/aichat/serviceGeneration/paths/codePath.py @@ -920,7 +920,7 @@ CRITICAL: def _getCodeRenderer(self, fileType: str): """Get code renderer for file type.""" - from modules.services.serviceGeneration.renderers.registry import getRenderer + from modules.features.aichat.serviceGeneration.renderers.registry import getRenderer # Map file types to renderer formats formatMap = { diff --git a/modules/services/serviceGeneration/paths/documentPath.py b/modules/features/aichat/serviceGeneration/paths/documentPath.py similarity index 100% rename from modules/services/serviceGeneration/paths/documentPath.py rename to modules/features/aichat/serviceGeneration/paths/documentPath.py diff --git a/modules/services/serviceGeneration/paths/imagePath.py b/modules/features/aichat/serviceGeneration/paths/imagePath.py similarity index 100% rename from modules/services/serviceGeneration/paths/imagePath.py rename to modules/features/aichat/serviceGeneration/paths/imagePath.py diff --git a/modules/services/serviceGeneration/renderers/codeRendererBaseTemplate.py b/modules/features/aichat/serviceGeneration/renderers/codeRendererBaseTemplate.py similarity index 100% rename from modules/services/serviceGeneration/renderers/codeRendererBaseTemplate.py rename to modules/features/aichat/serviceGeneration/renderers/codeRendererBaseTemplate.py diff --git a/modules/services/serviceGeneration/renderers/documentRendererBaseTemplate.py b/modules/features/aichat/serviceGeneration/renderers/documentRendererBaseTemplate.py similarity index 100% rename from modules/services/serviceGeneration/renderers/documentRendererBaseTemplate.py rename to modules/features/aichat/serviceGeneration/renderers/documentRendererBaseTemplate.py diff --git a/modules/services/serviceGeneration/renderers/registry.py b/modules/features/aichat/serviceGeneration/renderers/registry.py similarity index 100% rename from modules/services/serviceGeneration/renderers/registry.py rename to modules/features/aichat/serviceGeneration/renderers/registry.py diff --git a/modules/services/serviceGeneration/renderers/rendererCodeCsv.py b/modules/features/aichat/serviceGeneration/renderers/rendererCodeCsv.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererCodeCsv.py rename to modules/features/aichat/serviceGeneration/renderers/rendererCodeCsv.py diff --git a/modules/services/serviceGeneration/renderers/rendererCodeJson.py b/modules/features/aichat/serviceGeneration/renderers/rendererCodeJson.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererCodeJson.py rename to modules/features/aichat/serviceGeneration/renderers/rendererCodeJson.py diff --git a/modules/services/serviceGeneration/renderers/rendererCodeXml.py b/modules/features/aichat/serviceGeneration/renderers/rendererCodeXml.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererCodeXml.py rename to modules/features/aichat/serviceGeneration/renderers/rendererCodeXml.py diff --git a/modules/services/serviceGeneration/renderers/rendererCsv.py b/modules/features/aichat/serviceGeneration/renderers/rendererCsv.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererCsv.py rename to modules/features/aichat/serviceGeneration/renderers/rendererCsv.py diff --git a/modules/services/serviceGeneration/renderers/rendererDocx.py b/modules/features/aichat/serviceGeneration/renderers/rendererDocx.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererDocx.py rename to modules/features/aichat/serviceGeneration/renderers/rendererDocx.py diff --git a/modules/services/serviceGeneration/renderers/rendererHtml.py b/modules/features/aichat/serviceGeneration/renderers/rendererHtml.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererHtml.py rename to modules/features/aichat/serviceGeneration/renderers/rendererHtml.py diff --git a/modules/services/serviceGeneration/renderers/rendererImage.py b/modules/features/aichat/serviceGeneration/renderers/rendererImage.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererImage.py rename to modules/features/aichat/serviceGeneration/renderers/rendererImage.py diff --git a/modules/services/serviceGeneration/renderers/rendererJson.py b/modules/features/aichat/serviceGeneration/renderers/rendererJson.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererJson.py rename to modules/features/aichat/serviceGeneration/renderers/rendererJson.py diff --git a/modules/services/serviceGeneration/renderers/rendererMarkdown.py b/modules/features/aichat/serviceGeneration/renderers/rendererMarkdown.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererMarkdown.py rename to modules/features/aichat/serviceGeneration/renderers/rendererMarkdown.py diff --git a/modules/services/serviceGeneration/renderers/rendererPdf.py b/modules/features/aichat/serviceGeneration/renderers/rendererPdf.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererPdf.py rename to modules/features/aichat/serviceGeneration/renderers/rendererPdf.py diff --git a/modules/services/serviceGeneration/renderers/rendererPptx.py b/modules/features/aichat/serviceGeneration/renderers/rendererPptx.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererPptx.py rename to modules/features/aichat/serviceGeneration/renderers/rendererPptx.py diff --git a/modules/services/serviceGeneration/renderers/rendererText.py b/modules/features/aichat/serviceGeneration/renderers/rendererText.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererText.py rename to modules/features/aichat/serviceGeneration/renderers/rendererText.py diff --git a/modules/services/serviceGeneration/renderers/rendererXlsx.py b/modules/features/aichat/serviceGeneration/renderers/rendererXlsx.py similarity index 100% rename from modules/services/serviceGeneration/renderers/rendererXlsx.py rename to modules/features/aichat/serviceGeneration/renderers/rendererXlsx.py diff --git a/modules/services/serviceGeneration/subContentGenerator.py b/modules/features/aichat/serviceGeneration/subContentGenerator.py similarity index 99% rename from modules/services/serviceGeneration/subContentGenerator.py rename to modules/features/aichat/serviceGeneration/subContentGenerator.py index 86464ef6..5995077f 100644 --- a/modules/services/serviceGeneration/subContentGenerator.py +++ b/modules/features/aichat/serviceGeneration/subContentGenerator.py @@ -12,7 +12,7 @@ import base64 import re import traceback from typing import Dict, Any, Optional, List, Callable -from modules.services.serviceGeneration.subContentIntegrator import ContentIntegrator +from modules.features.aichat.serviceGeneration.subContentIntegrator import ContentIntegrator from modules.workflows.processing.shared.stateTools import checkWorkflowStopped logger = logging.getLogger(__name__) diff --git a/modules/services/serviceGeneration/subContentIntegrator.py b/modules/features/aichat/serviceGeneration/subContentIntegrator.py similarity index 100% rename from modules/services/serviceGeneration/subContentIntegrator.py rename to modules/features/aichat/serviceGeneration/subContentIntegrator.py diff --git a/modules/services/serviceGeneration/subDocumentUtility.py b/modules/features/aichat/serviceGeneration/subDocumentUtility.py similarity index 100% rename from modules/services/serviceGeneration/subDocumentUtility.py rename to modules/features/aichat/serviceGeneration/subDocumentUtility.py diff --git a/modules/services/serviceGeneration/subJsonSchema.py b/modules/features/aichat/serviceGeneration/subJsonSchema.py similarity index 100% rename from modules/services/serviceGeneration/subJsonSchema.py rename to modules/features/aichat/serviceGeneration/subJsonSchema.py diff --git a/modules/services/serviceGeneration/subPromptBuilderGeneration.py b/modules/features/aichat/serviceGeneration/subPromptBuilderGeneration.py similarity index 100% rename from modules/services/serviceGeneration/subPromptBuilderGeneration.py rename to modules/features/aichat/serviceGeneration/subPromptBuilderGeneration.py diff --git a/modules/services/serviceGeneration/subStructureGenerator.py b/modules/features/aichat/serviceGeneration/subStructureGenerator.py similarity index 100% rename from modules/services/serviceGeneration/subStructureGenerator.py rename to modules/features/aichat/serviceGeneration/subStructureGenerator.py diff --git a/modules/services/serviceWeb/mainServiceWeb.py b/modules/features/aichat/serviceWeb/mainServiceWeb.py similarity index 100% rename from modules/services/serviceWeb/mainServiceWeb.py rename to modules/features/aichat/serviceWeb/mainServiceWeb.py diff --git a/modules/features/automation/mainAutomation.py b/modules/features/automation/mainAutomation.py new file mode 100644 index 00000000..a0b8ba0f --- /dev/null +++ b/modules/features/automation/mainAutomation.py @@ -0,0 +1,148 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Automation Feature Container - Main Module. +Handles feature initialization and RBAC catalog registration. +""" + +import logging +from typing import Dict, List, Any + +logger = logging.getLogger(__name__) + +# Feature metadata +FEATURE_CODE = "automation" +FEATURE_LABEL = {"en": "Automation", "de": "Automatisierung", "fr": "Automatisation"} +FEATURE_ICON = "mdi-cog-clockwise" + +# UI Objects for RBAC catalog +UI_OBJECTS = [ + { + "objectKey": "ui.feature.automation.definitions", + "label": {"en": "Automation Definitions", "de": "Automatisierungs-Definitionen", "fr": "Définitions d'automatisation"}, + "meta": {"area": "definitions"} + }, + { + "objectKey": "ui.feature.automation.templates", + "label": {"en": "Templates", "de": "Vorlagen", "fr": "Modèles"}, + "meta": {"area": "templates"} + }, + { + "objectKey": "ui.feature.automation.logs", + "label": {"en": "Execution Logs", "de": "Ausführungsprotokolle", "fr": "Journaux d'exécution"}, + "meta": {"area": "logs"} + }, +] + +# Resource Objects for RBAC catalog +RESOURCE_OBJECTS = [ + { + "objectKey": "resource.feature.automation.create", + "label": {"en": "Create Automation", "de": "Automatisierung erstellen", "fr": "Créer automatisation"}, + "meta": {"endpoint": "/api/automations", "method": "POST"} + }, + { + "objectKey": "resource.feature.automation.update", + "label": {"en": "Update Automation", "de": "Automatisierung aktualisieren", "fr": "Modifier automatisation"}, + "meta": {"endpoint": "/api/automations/{automationId}", "method": "PUT"} + }, + { + "objectKey": "resource.feature.automation.delete", + "label": {"en": "Delete Automation", "de": "Automatisierung löschen", "fr": "Supprimer automatisation"}, + "meta": {"endpoint": "/api/automations/{automationId}", "method": "DELETE"} + }, + { + "objectKey": "resource.feature.automation.execute", + "label": {"en": "Execute Automation", "de": "Automatisierung ausführen", "fr": "Exécuter automatisation"}, + "meta": {"endpoint": "/api/automations/{automationId}/execute", "method": "POST"} + }, +] + +# Template roles for this feature +TEMPLATE_ROLES = [ + { + "roleLabel": "automation-admin", + "description": { + "en": "Automation Administrator - Full access to automation configuration and execution", + "de": "Automatisierungs-Administrator - Vollzugriff auf Automatisierungs-Konfiguration und Ausführung", + "fr": "Administrateur automatisation - Accès complet à la configuration et exécution" + } + }, + { + "roleLabel": "automation-editor", + "description": { + "en": "Automation Editor - Create and modify automations", + "de": "Automatisierungs-Editor - Automatisierungen erstellen und bearbeiten", + "fr": "Éditeur automatisation - Créer et modifier les automatisations" + } + }, + { + "roleLabel": "automation-viewer", + "description": { + "en": "Automation Viewer - View automations and execution results", + "de": "Automatisierungs-Betrachter - Automatisierungen und Ausführungsergebnisse einsehen", + "fr": "Visualiseur automatisation - Consulter les automatisations 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 diff --git a/modules/routes/routeDataAutomation.py b/modules/features/automation/routeFeatureAutomation.py similarity index 96% rename from modules/routes/routeDataAutomation.py rename to modules/features/automation/routeFeatureAutomation.py index db6affab..95c93334 100644 --- a/modules/routes/routeDataAutomation.py +++ b/modules/features/automation/routeFeatureAutomation.py @@ -13,13 +13,13 @@ import logging import json # Import interfaces and models -from modules.interfaces.interfaceDbChat import getInterface as getChatInterface +from modules.features.aichat.interfaceFeatureAiChat import getInterface as getChatInterface from modules.auth import getCurrentUser, limiter -from modules.datamodels.datamodelChat import AutomationDefinition, ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import AutomationDefinition, ChatWorkflow from modules.datamodels.datamodelPagination import PaginationParams, PaginatedResponse, PaginationMetadata, normalize_pagination_dict from modules.shared.attributeUtils import getModelAttributeDefinitions -from modules.features.workflow import executeAutomation -from modules.features.workflow.subAutomationTemplates import getAutomationTemplates +from modules.workflows.automation import executeAutomation +from .subAutomationTemplates import getAutomationTemplates # Configure logger logger = logging.getLogger(__name__) diff --git a/modules/features/workflow/subAutomationTemplates.py b/modules/features/automation/subAutomationTemplates.py similarity index 100% rename from modules/features/workflow/subAutomationTemplates.py rename to modules/features/automation/subAutomationTemplates.py diff --git a/modules/features/workflow/subAutomationUtils.py b/modules/features/automation/subAutomationUtils.py similarity index 100% rename from modules/features/workflow/subAutomationUtils.py rename to modules/features/automation/subAutomationUtils.py diff --git a/modules/datamodels/datamodelChatbot.py b/modules/features/chatbot/datamodelFeatureChatbot.py similarity index 100% rename from modules/datamodels/datamodelChatbot.py rename to modules/features/chatbot/datamodelFeatureChatbot.py diff --git a/modules/interfaces/interfaceDbChatbot.py b/modules/features/chatbot/interfaceFeatureChatbot.py similarity index 99% rename from modules/interfaces/interfaceDbChatbot.py rename to modules/features/chatbot/interfaceFeatureChatbot.py index 44f124b5..bce7d43e 100644 --- a/modules/interfaces/interfaceDbChatbot.py +++ b/modules/features/chatbot/interfaceFeatureChatbot.py @@ -16,7 +16,7 @@ from modules.security.rbac import RbacClass from modules.datamodels.datamodelRbac import AccessRuleContext from modules.datamodels.datamodelUam import AccessLevel -from modules.datamodels.datamodelChat import ( +from .datamodelFeatureChatbot import ( ChatDocument, ChatStat, ChatLog, diff --git a/modules/features/chatbot/mainChatbot.py b/modules/features/chatbot/mainChatbot.py index 43503339..a82e89dc 100644 --- a/modules/features/chatbot/mainChatbot.py +++ b/modules/features/chatbot/mainChatbot.py @@ -4,16 +4,120 @@ Simple chatbot feature - basic implementation. User input is processed by AI to create list of needed queries. Those queries get streamed back. + +This module also handles feature initialization and RBAC catalog registration. """ import logging + +# Feature metadata for RBAC catalog +FEATURE_CODE = "chatbot" +FEATURE_LABEL = {"en": "Chatbot", "de": "Chatbot", "fr": "Chatbot"} +FEATURE_ICON = "mdi-robot" + +# UI Objects for RBAC catalog +UI_OBJECTS = [ + { + "objectKey": "ui.feature.chatbot.conversations", + "label": {"en": "Conversations", "de": "Konversationen", "fr": "Conversations"}, + "meta": {"area": "conversations"} + }, + { + "objectKey": "ui.feature.chatbot.settings", + "label": {"en": "Settings", "de": "Einstellungen", "fr": "Paramètres"}, + "meta": {"area": "settings"} + }, +] + +# Resource Objects for RBAC catalog +RESOURCE_OBJECTS = [ + { + "objectKey": "resource.feature.chatbot.start", + "label": {"en": "Start Chatbot", "de": "Chatbot starten", "fr": "Démarrer chatbot"}, + "meta": {"endpoint": "/api/chatbot/start/stream", "method": "POST"} + }, + { + "objectKey": "resource.feature.chatbot.stop", + "label": {"en": "Stop Chatbot", "de": "Chatbot stoppen", "fr": "Arrêter chatbot"}, + "meta": {"endpoint": "/api/chatbot/stop/{workflowId}", "method": "POST"} + }, +] + +# Template roles for this feature +TEMPLATE_ROLES = [ + { + "roleLabel": "chatbot-admin", + "description": { + "en": "Chatbot Administrator - Full access to chatbot settings and all conversations", + "de": "Chatbot-Administrator - Vollzugriff auf Chatbot-Einstellungen und alle Konversationen", + "fr": "Administrateur chatbot - Accès complet aux paramètres et conversations" + } + }, + { + "roleLabel": "chatbot-user", + "description": { + "en": "Chatbot User - Use chatbot and view own conversations", + "de": "Chatbot-Benutzer - Chatbot nutzen und eigene Konversationen einsehen", + "fr": "Utilisateur chatbot - Utiliser le chatbot et consulter ses conversations" + } + }, +] + + +def getFeatureDefinition(): + """Return the feature definition for registration.""" + return { + "code": FEATURE_CODE, + "label": FEATURE_LABEL, + "icon": FEATURE_ICON + } + + +def getUiObjects(): + """Return UI objects for RBAC catalog registration.""" + return UI_OBJECTS + + +def getResourceObjects(): + """Return resource objects for RBAC catalog registration.""" + return RESOURCE_OBJECTS + + +def getTemplateRoles(): + """Return template roles for this feature.""" + return TEMPLATE_ROLES + + +def registerFeature(catalogService) -> bool: + """Register this feature's RBAC objects in the catalog.""" + try: + for uiObj in UI_OBJECTS: + catalogService.registerUiObject( + featureCode=FEATURE_CODE, + objectKey=uiObj["objectKey"], + label=uiObj["label"], + meta=uiObj.get("meta") + ) + + for resObj in RESOURCE_OBJECTS: + catalogService.registerResourceObject( + featureCode=FEATURE_CODE, + objectKey=resObj["objectKey"], + label=resObj["label"], + meta=resObj.get("meta") + ) + + return True + except Exception as e: + logging.getLogger(__name__).error(f"Failed to register feature '{FEATURE_CODE}': {e}") + return False import json import uuid import asyncio import re from typing import Optional, Dict, Any, List -from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum, ChatLog, ChatDocument +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum, ChatLog, ChatDocument from modules.datamodels.datamodelUam import User from modules.datamodels.datamodelAi import AiCallRequest, AiCallOptions, OperationTypeEnum, ProcessingModeEnum from modules.datamodels.datamodelDocref import DocumentReferenceList, DocumentItemReference @@ -335,7 +439,7 @@ async def _emit_log_and_event( # Emit event directly for streaming (using correct signature) if created_log and event_manager: try: - from modules.datamodels.datamodelChat import ChatLog + from modules.features.aichat.datamodelFeatureAiChat import ChatLog # Convert to dict if it's a Pydantic model if hasattr(created_log, "model_dump"): log_dict = created_log.model_dump() diff --git a/modules/routes/routeFeatureChatbot.py b/modules/features/chatbot/routeFeatureChatbot.py similarity index 98% rename from modules/routes/routeFeatureChatbot.py rename to modules/features/chatbot/routeFeatureChatbot.py index 977158f0..3c97c753 100644 --- a/modules/routes/routeFeatureChatbot.py +++ b/modules/features/chatbot/routeFeatureChatbot.py @@ -18,19 +18,19 @@ from modules.shared.timeUtils import parseTimestamp from modules.auth import limiter, getRequestContext, RequestContext # Import interfaces -import modules.interfaces.interfaceDbChat as interfaceDbChat +from . import interfaceFeatureChatbot as interfaceDbChat from modules.interfaces.interfaceRbac import getRecordsetWithRBAC # Import models -from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum +from .datamodelFeatureChatbot import ChatWorkflow, UserInputRequest, WorkflowModeEnum from modules.datamodels.datamodelPagination import PaginationParams, PaginatedResponse # Import chatbot feature -from modules.features.chatbot import chatProcess -from modules.features.chatbot.eventManager import get_event_manager +from . import chatProcess +from .eventManager import get_event_manager # Import workflow control functions -from modules.features.workflow import chatStop +from modules.workflows.automation import chatStop # Configure logger logger = logging.getLogger(__name__) diff --git a/modules/features/dynamicOptions/mainDynamicOptions.py b/modules/features/dynamicOptions/mainDynamicOptions.py deleted file mode 100644 index e8c9a4ff..00000000 --- a/modules/features/dynamicOptions/mainDynamicOptions.py +++ /dev/null @@ -1,237 +0,0 @@ -# Copyright (c) 2025 Patrick Motsch -# All rights reserved. -""" -Dynamic Options API feature module. -Provides dynamic options for frontend select/multiselect fields. -""" - -import logging -from typing import List, Dict, Any, Optional -from modules.datamodels.datamodelUam import User - -logger = logging.getLogger(__name__) - -# Standard role definitions (fallback if database is not available) -STANDARD_ROLES = [ - {"value": "sysadmin", "label": {"en": "System Administrator", "fr": "Administrateur système"}}, - {"value": "admin", "label": {"en": "Administrator", "fr": "Administrateur"}}, - {"value": "user", "label": {"en": "User", "fr": "Utilisateur"}}, - {"value": "viewer", "label": {"en": "Viewer", "fr": "Visualiseur"}}, -] - -# Authentication authority options -AUTH_AUTHORITY_OPTIONS = [ - {"value": "local", "label": {"en": "Local", "fr": "Local"}}, - {"value": "google", "label": {"en": "Google", "fr": "Google"}}, - {"value": "msft", "label": {"en": "Microsoft", "fr": "Microsoft"}}, -] - -# Connection status options -# Note: Matches ConnectionStatus enum values (active, expired, revoked, pending) -# Plus "error" for error states (not in enum but used in UI) -CONNECTION_STATUS_OPTIONS = [ - {"value": "active", "label": {"en": "Active", "fr": "Actif"}}, - {"value": "expired", "label": {"en": "Expired", "fr": "Expiré"}}, - {"value": "revoked", "label": {"en": "Revoked", "fr": "Révoqué"}}, - {"value": "pending", "label": {"en": "Pending", "fr": "En attente"}}, - {"value": "error", "label": {"en": "Error", "fr": "Erreur"}}, -] - - -def getOptions(optionsName: str, services, currentUser: Optional[User] = None) -> List[Dict[str, Any]]: - """ - Get options for a given options name. - - Args: - optionsName: Name of the options set to retrieve (e.g., "user.role", "user.connection") - services: Services instance for data access - currentUser: Optional current user for context-aware options - - Returns: - List of option dictionaries with "value" and "label" keys - - Raises: - ValueError: If optionsName is not recognized - """ - logger.debug(f"getOptions called with optionsName='{optionsName}' (repr: {repr(optionsName)})") - optionsNameLower = optionsName.lower() - logger.debug(f"optionsNameLower='{optionsNameLower}'") - - if optionsNameLower == "user.role": - # Fetch roles from database - if currentUser: - try: - roles = services.interfaceDbApp.getAllRoles() - - # Convert Role objects to options format - options = [] - for role in roles: - # Use English description as label, fallback to roleLabel - # Handle TextMultilingual object - if hasattr(role.description, 'get_text'): - # TextMultilingual object - label = role.description.get_text('en') - elif isinstance(role.description, dict): - # Dict format (backward compatibility) - label = role.description.get("en", role.roleLabel) - else: - # Fallback to roleLabel - label = role.roleLabel - - options.append({ - "value": role.roleLabel, - "label": label - }) - - # If no roles in database, return standard roles as fallback - if options: - return options - except Exception as e: - logger.warning(f"Error fetching roles from database, using fallback: {e}") - - # Fallback to standard roles if database fetch fails or no user context - return STANDARD_ROLES - - elif optionsNameLower == "auth.authority": - return AUTH_AUTHORITY_OPTIONS - - elif optionsNameLower == "connection.status": - return CONNECTION_STATUS_OPTIONS - - elif optionsNameLower == "user.connection": - # Dynamic options: Get user connections from database - if not currentUser: - return [] - - try: - connections = services.interfaceDbApp.getUserConnections(currentUser.id) - - return [ - { - "value": conn.id, - "label": { - "en": f"{conn.authority.value} - {conn.externalUsername or conn.externalId}", - "fr": f"{conn.authority.value} - {conn.externalUsername or conn.externalId}" - } - } - for conn in connections - ] - except Exception as e: - logger.error(f"Error fetching user connections for options: {e}") - return [] - - elif optionsNameLower in ("user", "users"): - # Dynamic options: Get all users for the current mandate - if not currentUser: - return [] - - try: - users = services.interfaceDbApp.getUsersByMandate(services.mandateId) - - # Handle both list and PaginatedResult - if hasattr(users, 'items'): - userList = users.items - else: - userList = users - - return [ - { - "value": user.id, - "label": user.fullName or user.username or user.email or user.id - } - for user in userList - ] - except Exception as e: - logger.error(f"Error fetching users for options: {e}") - return [] - - elif optionsNameLower in ("trusteeorganisation", "trustee.organisation"): - # Dynamic options: Get all trustee organisations - if not currentUser: - return [] - - try: - result = services.interfaceDbTrustee.getAllOrganisations() - - # Handle PaginatedResult - items = result.items if hasattr(result, 'items') else result - - return [ - { - "value": org.get("id") if isinstance(org, dict) else org.id, - "label": org.get("label") if isinstance(org, dict) else org.label - } - for org in items - ] - except Exception as e: - logger.error(f"Error fetching trustee organisations for options: {e}") - return [] - - elif optionsNameLower in ("trusteerole", "trustee.role"): - # Dynamic options: Get all trustee roles - if not currentUser: - return [] - - try: - result = services.interfaceDbTrustee.getAllRoles() - - # Handle PaginatedResult - items = result.items if hasattr(result, 'items') else result - - return [ - { - "value": role.get("id") if isinstance(role, dict) else role.id, - # TrusteeRole uses 'desc' field, not 'label' - "label": role.get("desc", role.get("id")) if isinstance(role, dict) else getattr(role, "desc", role.id) - } - for role in items - ] - except Exception as e: - logger.error(f"Error fetching trustee roles for options: {e}") - return [] - - elif optionsNameLower in ("trusteecontract", "trustee.contract"): - # Dynamic options: Get all trustee contracts - if not currentUser: - return [] - - try: - result = services.interfaceDbTrustee.getAllContracts() - - # Handle PaginatedResult - items = result.items if hasattr(result, 'items') else result - - return [ - { - "value": contract.get("id") if isinstance(contract, dict) else contract.id, - "label": contract.get("label") if isinstance(contract, dict) else (contract.get("name") if isinstance(contract, dict) else getattr(contract, "label", getattr(contract, "name", contract.id))) - } - for contract in items - ] - except Exception as e: - logger.error(f"Error fetching trustee contracts for options: {e}") - return [] - - else: - logger.error(f"Unknown options name: '{optionsName}' (lower: '{optionsNameLower}')") - raise ValueError(f"Unknown options name: {optionsName}") - - -def getAvailableOptionsNames() -> List[str]: - """ - Get list of all available options names. - - Returns: - List of available options names - """ - return [ - "user.role", - "auth.authority", - "connection.status", - "user.connection", - "User", - "TrusteeOrganisation", - "TrusteeRole", - "TrusteeContract", - ] - diff --git a/modules/features/featureRegistry.py b/modules/features/featureRegistry.py new file mode 100644 index 00000000..29eb35c9 --- /dev/null +++ b/modules/features/featureRegistry.py @@ -0,0 +1,117 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Feature Registry for Plug&Play Feature Container Loading. +Dynamically discovers and loads feature containers from the features directory. +""" + +import os +import glob +import importlib +import logging +from typing import List, Dict, Any +from fastapi import FastAPI + +logger = logging.getLogger(__name__) + +# Path to the features directory +FEATURES_DIR = os.path.dirname(os.path.abspath(__file__)) + + +def discoverFeatureContainers() -> List[str]: + """ + Discover all feature container directories by filename pattern. + A valid feature container has a routeFeature*.py file. + """ + containers = [] + pattern = os.path.join(FEATURES_DIR, "*", "routeFeature*.py") + + for filepath in glob.glob(pattern): + featureDir = os.path.basename(os.path.dirname(filepath)) + if featureDir not in containers and not featureDir.startswith("_"): + containers.append(featureDir) + + return sorted(containers) + + +def loadFeatureRouters(app: FastAPI) -> Dict[str, Any]: + """ + Dynamically load and register routers from all discovered feature containers. + """ + results = {} + pattern = os.path.join(FEATURES_DIR, "*", "routeFeature*.py") + + for filepath in glob.glob(pattern): + featureDir = os.path.basename(os.path.dirname(filepath)) + routerFile = os.path.basename(filepath)[:-3] # Remove .py + + if featureDir.startswith("_"): + continue + + try: + modulePath = f"modules.features.{featureDir}.{routerFile}" + module = importlib.import_module(modulePath) + + if hasattr(module, "router"): + app.include_router(module.router) + logger.info(f"Loaded router: {featureDir}") + results[featureDir] = {"status": "loaded", "module": modulePath} + else: + logger.warning(f"No 'router' in {modulePath}") + results[featureDir] = {"status": "no_router_object"} + + except Exception as e: + logger.error(f"Failed to load router from {featureDir}: {e}") + results[featureDir] = {"status": "error", "error": str(e)} + + return results + + +def loadFeatureMainModules() -> Dict[str, Any]: + """ + Dynamically load main modules from all discovered feature containers. + """ + mainModules = {} + pattern = os.path.join(FEATURES_DIR, "*", "main*.py") + + for filepath in glob.glob(pattern): + filename = os.path.basename(filepath) + if filename == "__init__.py": + continue + + featureDir = os.path.basename(os.path.dirname(filepath)) + if featureDir.startswith("_"): + continue + + mainFile = filename[:-3] # Remove .py + + try: + modulePath = f"modules.features.{featureDir}.{mainFile}" + module = importlib.import_module(modulePath) + mainModules[featureDir] = module + logger.debug(f"Loaded main module: {featureDir}") + except Exception as e: + logger.error(f"Failed to load main module from {featureDir}: {e}") + + return mainModules + + +def registerAllFeaturesInCatalog(catalogService) -> Dict[str, bool]: + """ + Register all features' RBAC objects in the catalog. + """ + mainModules = loadFeatureMainModules() + results = {} + + for featureName, module in mainModules.items(): + if hasattr(module, "registerFeature"): + try: + success = module.registerFeature(catalogService) + results[featureName] = success + if success: + logger.info(f"Registered RBAC objects: {featureName}") + except Exception as e: + logger.error(f"Error registering {featureName}: {e}") + results[featureName] = False + + return results diff --git a/modules/features/featuresLifecycle.py b/modules/features/featuresLifecycle.py deleted file mode 100644 index 0e747676..00000000 --- a/modules/features/featuresLifecycle.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright (c) 2025 Patrick Motsch -# All rights reserved. -import logging -from modules.services import getInterface as getServices - -logger = logging.getLogger(__name__) - -async def start(eventUser) -> None: - """ Start feature triggers and background managers - - Args: - eventUser: System-level event user for background operations (provided by app.py) - """ - - # Feature Workflow (Automation) - if eventUser: - try: - from modules.features.workflow import syncAutomationEvents - from modules.shared.callbackRegistry import callbackRegistry - - # Get services for event user (provides access to interfaces) - services = getServices(eventUser, None) - - # Register callback for automation changes - async def onAutomationChanged(chatInterface): - """Callback triggered when automations are created/updated/deleted.""" - # Get services for event user to pass to syncAutomationEvents - eventServices = getServices(eventUser, None) - await syncAutomationEvents(eventServices, eventUser) - - callbackRegistry.register('automation.changed', onAutomationChanged) - logger.info("Workflow: Registered change callback") - - # Initial sync on startup - use services - await syncAutomationEvents(services, eventUser) - logger.info("Workflow: Events synced on startup") - except Exception as e: - logger.error(f"Workflow: Error setting up events on startup: {str(e)}") - # Don't fail startup if automation sync fails - - - # Feature ... - - return True - - - -async def stop(eventUser) -> None: - """ Stop feature triggers and background managers - - Args: - eventUser: System-level event user (provided by app.py) - """ - - # Feature Workflow (Automation) - # Callbacks will remain registered (acceptable for shutdown) - logger.info("Workflow: Callbacks remain registered (will be cleaned up on shutdown)") - - - # Feature ... - - return True diff --git a/modules/datamodels/datamodelNeutralizer.py b/modules/features/neutralizer/datamodelFeatureNeutralizer.py similarity index 100% rename from modules/datamodels/datamodelNeutralizer.py rename to modules/features/neutralizer/datamodelFeatureNeutralizer.py diff --git a/modules/features/neutralizePlayground/mainNeutralizePlayground.py b/modules/features/neutralizer/mainNeutralizePlayground.py similarity index 99% rename from modules/features/neutralizePlayground/mainNeutralizePlayground.py rename to modules/features/neutralizer/mainNeutralizePlayground.py index d10dc8ec..c5932117 100644 --- a/modules/features/neutralizePlayground/mainNeutralizePlayground.py +++ b/modules/features/neutralizer/mainNeutralizePlayground.py @@ -6,7 +6,7 @@ from typing import Any, Dict, List, Optional from urllib.parse import urlparse, unquote from modules.datamodels.datamodelUam import User -from modules.datamodels.datamodelNeutralizer import DataNeutralizerAttributes, DataNeutraliserConfig +from .datamodelFeatureNeutralizer import DataNeutralizerAttributes, DataNeutraliserConfig from modules.services import getInterface as getServices logger = logging.getLogger(__name__) diff --git a/modules/features/neutralizer/mainNeutralizer.py b/modules/features/neutralizer/mainNeutralizer.py new file mode 100644 index 00000000..44d495c4 --- /dev/null +++ b/modules/features/neutralizer/mainNeutralizer.py @@ -0,0 +1,125 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Neutralizer Feature Container - Main Module. +Handles feature initialization and RBAC catalog registration. +""" + +import logging +from typing import Dict, List, Any + +logger = logging.getLogger(__name__) + +# Feature metadata +FEATURE_CODE = "neutralization" +FEATURE_LABEL = {"en": "Neutralization", "de": "Neutralisierung", "fr": "Neutralisation"} +FEATURE_ICON = "mdi-shield-check" + +# UI Objects for RBAC catalog +UI_OBJECTS = [ + { + "objectKey": "ui.feature.neutralizer.playground", + "label": {"en": "Playground", "de": "Spielwiese", "fr": "Bac à sable"}, + "meta": {"area": "playground"} + }, + { + "objectKey": "ui.feature.neutralizer.config", + "label": {"en": "Configuration", "de": "Konfiguration", "fr": "Configuration"}, + "meta": {"area": "config"} + }, + { + "objectKey": "ui.feature.neutralizer.attributes", + "label": {"en": "Attributes", "de": "Attribute", "fr": "Attributs"}, + "meta": {"area": "attributes"} + }, +] + +# Resource Objects for RBAC catalog +RESOURCE_OBJECTS = [ + { + "objectKey": "resource.feature.neutralizer.process.text", + "label": {"en": "Process Text", "de": "Text verarbeiten", "fr": "Traiter texte"}, + "meta": {"endpoint": "/api/neutralization/process/text", "method": "POST"} + }, + { + "objectKey": "resource.feature.neutralizer.process.files", + "label": {"en": "Process Files", "de": "Dateien verarbeiten", "fr": "Traiter fichiers"}, + "meta": {"endpoint": "/api/neutralization/process/files", "method": "POST"} + }, + { + "objectKey": "resource.feature.neutralizer.config.update", + "label": {"en": "Update Config", "de": "Konfiguration aktualisieren", "fr": "Mettre à jour config"}, + "meta": {"endpoint": "/api/neutralization/config", "method": "PUT"} + }, +] + +# Template roles for this feature +TEMPLATE_ROLES = [ + { + "roleLabel": "neutralization-admin", + "description": { + "en": "Neutralization Administrator - Full access to neutralization settings and data", + "de": "Neutralisierungs-Administrator - Vollzugriff auf Neutralisierungs-Einstellungen und Daten", + "fr": "Administrateur neutralisation - Accès complet aux paramètres et données" + } + }, + { + "roleLabel": "neutralization-analyst", + "description": { + "en": "Neutralization Analyst - Analyze and process neutralization data", + "de": "Neutralisierungs-Analyst - Neutralisierungsdaten analysieren und verarbeiten", + "fr": "Analyste neutralisation - Analyser et traiter les données de neutralisation" + } + }, +] + + +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.""" + try: + for uiObj in UI_OBJECTS: + catalogService.registerUiObject( + featureCode=FEATURE_CODE, + objectKey=uiObj["objectKey"], + label=uiObj["label"], + meta=uiObj.get("meta") + ) + + 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 diff --git a/modules/routes/routeFeatureNeutralization.py b/modules/features/neutralizer/routeFeatureNeutralizer.py similarity index 97% rename from modules/routes/routeFeatureNeutralization.py rename to modules/features/neutralizer/routeFeatureNeutralizer.py index 04d034dc..be262e47 100644 --- a/modules/routes/routeFeatureNeutralization.py +++ b/modules/features/neutralizer/routeFeatureNeutralizer.py @@ -8,8 +8,8 @@ import logging from modules.auth import limiter, getRequestContext, RequestContext # Import interfaces -from modules.datamodels.datamodelNeutralizer import DataNeutraliserConfig, DataNeutralizerAttributes -from modules.features.neutralizePlayground.mainNeutralizePlayground import NeutralizationPlayground +from .datamodelFeatureNeutralizer import DataNeutraliserConfig, DataNeutralizerAttributes +from .mainNeutralizePlayground import NeutralizationPlayground # Configure logger logger = logging.getLogger(__name__) diff --git a/modules/services/serviceNeutralization/mainServiceNeutralization.py b/modules/features/neutralizer/serviceNeutralization/mainServiceNeutralization.py similarity index 95% rename from modules/services/serviceNeutralization/mainServiceNeutralization.py rename to modules/features/neutralizer/serviceNeutralization/mainServiceNeutralization.py index 3d2198b6..fb47c188 100644 --- a/modules/services/serviceNeutralization/mainServiceNeutralization.py +++ b/modules/features/neutralizer/serviceNeutralization/mainServiceNeutralization.py @@ -13,14 +13,14 @@ import re import json from typing import Dict, List, Any, Optional -from modules.datamodels.datamodelNeutralizer import DataNeutraliserConfig, DataNeutralizerAttributes +from modules.features.neutralizer.datamodelFeatureNeutralizer import DataNeutraliserConfig, DataNeutralizerAttributes # Import all necessary classes and functions for neutralization -from modules.services.serviceNeutralization.subProcessCommon import CommonUtils, NeutralizationResult, NeutralizationAttribute -from modules.services.serviceNeutralization.subProcessText import TextProcessor, PlainText -from modules.services.serviceNeutralization.subProcessList import ListProcessor, TableData -from modules.services.serviceNeutralization.subProcessBinary import BinaryProcessor -from modules.services.serviceNeutralization.subPatterns import HeaderPatterns, DataPatterns, TextTablePatterns +from .subProcessCommon import CommonUtils, NeutralizationResult, NeutralizationAttribute +from .subProcessText import TextProcessor, PlainText +from .subProcessList import ListProcessor, TableData +from .subProcessBinary import BinaryProcessor +from .subPatterns import HeaderPatterns, DataPatterns, TextTablePatterns logger = logging.getLogger(__name__) diff --git a/modules/services/serviceNeutralization/subParseString.py b/modules/features/neutralizer/serviceNeutralization/subParseString.py similarity index 98% rename from modules/services/serviceNeutralization/subParseString.py rename to modules/features/neutralizer/serviceNeutralization/subParseString.py index 160719c9..1a1b54ad 100644 --- a/modules/services/serviceNeutralization/subParseString.py +++ b/modules/features/neutralizer/serviceNeutralization/subParseString.py @@ -8,7 +8,7 @@ Handles pattern matching and replacement for emails, phones, addresses, IDs and import re import uuid from typing import Dict, List, Tuple, Any -from modules.services.serviceNeutralization.subPatterns import DataPatterns, findPatternsInText +from .subPatterns import DataPatterns, findPatternsInText class StringParser: """Handles string parsing and replacement operations""" diff --git a/modules/services/serviceNeutralization/subPatterns.py b/modules/features/neutralizer/serviceNeutralization/subPatterns.py similarity index 100% rename from modules/services/serviceNeutralization/subPatterns.py rename to modules/features/neutralizer/serviceNeutralization/subPatterns.py diff --git a/modules/services/serviceNeutralization/subProcessBinary.py b/modules/features/neutralizer/serviceNeutralization/subProcessBinary.py similarity index 100% rename from modules/services/serviceNeutralization/subProcessBinary.py rename to modules/features/neutralizer/serviceNeutralization/subProcessBinary.py diff --git a/modules/services/serviceNeutralization/subProcessCommon.py b/modules/features/neutralizer/serviceNeutralization/subProcessCommon.py similarity index 100% rename from modules/services/serviceNeutralization/subProcessCommon.py rename to modules/features/neutralizer/serviceNeutralization/subProcessCommon.py diff --git a/modules/services/serviceNeutralization/subProcessList.py b/modules/features/neutralizer/serviceNeutralization/subProcessList.py similarity index 96% rename from modules/services/serviceNeutralization/subProcessList.py rename to modules/features/neutralizer/serviceNeutralization/subProcessList.py index 3996ccbc..97721535 100644 --- a/modules/services/serviceNeutralization/subProcessList.py +++ b/modules/features/neutralizer/serviceNeutralization/subProcessList.py @@ -11,8 +11,8 @@ import xml.etree.ElementTree as ET from typing import Dict, List, Any, Union from dataclasses import dataclass from io import StringIO -from modules.services.serviceNeutralization.subParseString import StringParser -from modules.services.serviceNeutralization.subPatterns import getPatternForHeader, HeaderPatterns +from .subParseString import StringParser +from .subPatterns import getPatternForHeader, HeaderPatterns @dataclass class TableData: @@ -158,7 +158,7 @@ class ListProcessor: processedAttrs[attrName] = self.string_parser.mapping[attrValue] else: # Check if attribute value matches any data patterns - from modules.services.serviceNeutralization.subPatterns import findPatternsInText, DataPatterns + from .subPatterns import findPatternsInText, DataPatterns matches = findPatternsInText(attrValue, DataPatterns.patterns) if matches: patternName = matches[0][0] @@ -193,7 +193,7 @@ class ListProcessor: # Skip if already a placeholder if not self.string_parser._isPlaceholder(text): # Check if text matches any patterns - from modules.services.serviceNeutralization.subPatterns import findPatternsInText, DataPatterns + from .subPatterns import findPatternsInText, DataPatterns patternMatches = findPatternsInText(text, DataPatterns.patterns) if patternMatches: diff --git a/modules/services/serviceNeutralization/subProcessText.py b/modules/features/neutralizer/serviceNeutralization/subProcessText.py similarity index 97% rename from modules/services/serviceNeutralization/subProcessText.py rename to modules/features/neutralizer/serviceNeutralization/subProcessText.py index 5366fc1b..eea270b9 100644 --- a/modules/services/serviceNeutralization/subProcessText.py +++ b/modules/features/neutralizer/serviceNeutralization/subProcessText.py @@ -7,7 +7,7 @@ Handles plain text processing without header information from typing import Dict, List, Any from dataclasses import dataclass -from modules.services.serviceNeutralization.subParseString import StringParser +from .subParseString import StringParser @dataclass class PlainText: diff --git a/modules/datamodels/datamodelRealEstate.py b/modules/features/realEstate/datamodelFeatureRealEstate.py similarity index 100% rename from modules/datamodels/datamodelRealEstate.py rename to modules/features/realEstate/datamodelFeatureRealEstate.py diff --git a/modules/interfaces/interfaceDbRealEstate.py b/modules/features/realEstate/interfaceFeatureRealEstate.py similarity index 99% rename from modules/interfaces/interfaceDbRealEstate.py rename to modules/features/realEstate/interfaceFeatureRealEstate.py index 179ec6dd..545be2c0 100644 --- a/modules/interfaces/interfaceDbRealEstate.py +++ b/modules/features/realEstate/interfaceFeatureRealEstate.py @@ -6,7 +6,7 @@ Handles CRUD operations on Real Estate entities (Projekt, Parzelle, etc.). import logging from typing import Dict, Any, List, Optional, Union -from modules.datamodels.datamodelRealEstate import ( +from .datamodelFeatureRealEstate import ( Projekt, Parzelle, Dokument, diff --git a/modules/features/realEstate/mainRealEstate.py b/modules/features/realEstate/mainRealEstate.py index bc729e0d..76f658ba 100644 --- a/modules/features/realEstate/mainRealEstate.py +++ b/modules/features/realEstate/mainRealEstate.py @@ -2,16 +2,128 @@ Real Estate feature main logic. Handles database operations with AI-powered natural language processing. Stateless implementation without session management. + +This module also handles feature initialization and RBAC catalog registration. """ import logging + +# Feature metadata for RBAC catalog +FEATURE_CODE = "realestate" +FEATURE_LABEL = {"en": "Real Estate", "de": "Immobilien", "fr": "Immobilier"} +FEATURE_ICON = "mdi-home-city" + +# UI Objects for RBAC catalog +UI_OBJECTS = [ + { + "objectKey": "ui.feature.realestate.projects", + "label": {"en": "Projects", "de": "Projekte", "fr": "Projets"}, + "meta": {"area": "projects"} + }, + { + "objectKey": "ui.feature.realestate.parcels", + "label": {"en": "Parcels", "de": "Parzellen", "fr": "Parcelles"}, + "meta": {"area": "parcels"} + }, +] + +# Resource Objects for RBAC catalog +RESOURCE_OBJECTS = [ + { + "objectKey": "resource.feature.realestate.project.create", + "label": {"en": "Create Project", "de": "Projekt erstellen", "fr": "Créer projet"}, + "meta": {"endpoint": "/api/realestate/project", "method": "POST"} + }, + { + "objectKey": "resource.feature.realestate.project.delete", + "label": {"en": "Delete Project", "de": "Projekt löschen", "fr": "Supprimer projet"}, + "meta": {"endpoint": "/api/realestate/project/{projectId}", "method": "DELETE"} + }, +] + +# Template roles for this feature +TEMPLATE_ROLES = [ + { + "roleLabel": "realestate-admin", + "description": { + "en": "Real Estate Administrator - Full access to all property data and settings", + "de": "Immobilien-Administrator - Vollzugriff auf alle Immobiliendaten und Einstellungen", + "fr": "Administrateur immobilier - Accès complet aux données et paramètres" + } + }, + { + "roleLabel": "realestate-manager", + "description": { + "en": "Real Estate Manager - Manage properties and tenants", + "de": "Immobilien-Verwalter - Immobilien und Mieter verwalten", + "fr": "Gestionnaire immobilier - Gérer les propriétés et locataires" + } + }, + { + "roleLabel": "realestate-viewer", + "description": { + "en": "Real Estate Viewer - View property information", + "de": "Immobilien-Betrachter - Immobilien-Informationen einsehen", + "fr": "Visualiseur immobilier - Consulter les informations immobilières" + } + }, +] + + +def getFeatureDefinition(): + """Return the feature definition for registration.""" + return { + "code": FEATURE_CODE, + "label": FEATURE_LABEL, + "icon": FEATURE_ICON + } + + +def getUiObjects(): + """Return UI objects for RBAC catalog registration.""" + return UI_OBJECTS + + +def getResourceObjects(): + """Return resource objects for RBAC catalog registration.""" + return RESOURCE_OBJECTS + + +def getTemplateRoles(): + """Return template roles for this feature.""" + return TEMPLATE_ROLES + + +def registerFeature(catalogService) -> bool: + """Register this feature's RBAC objects in the catalog.""" + try: + for uiObj in UI_OBJECTS: + catalogService.registerUiObject( + featureCode=FEATURE_CODE, + objectKey=uiObj["objectKey"], + label=uiObj["label"], + meta=uiObj.get("meta") + ) + + for resObj in RESOURCE_OBJECTS: + catalogService.registerResourceObject( + featureCode=FEATURE_CODE, + objectKey=resObj["objectKey"], + label=resObj["label"], + meta=resObj.get("meta") + ) + + return True + except Exception as e: + logging.getLogger(__name__).error(f"Failed to register feature '{FEATURE_CODE}': {e}") + return False import json from typing import Optional, Dict, Any, List from fastapi import HTTPException, status from shapely.geometry import Polygon from shapely.ops import unary_union from modules.datamodels.datamodelUam import User -from modules.datamodels.datamodelRealEstate import ( +from .datamodelFeatureRealEstate import ( Projekt, Parzelle, StatusProzess, @@ -23,7 +135,7 @@ from modules.datamodels.datamodelRealEstate import ( Land, ) from modules.services import getInterface as getServices -from modules.interfaces.interfaceDbRealestate import getInterface as getRealEstateInterface +from .interfaceFeatureRealEstate import getInterface as getRealEstateInterface from modules.connectors.connectorSwissTopoMapServer import SwissTopoMapServerConnector logger = logging.getLogger(__name__) @@ -905,7 +1017,7 @@ async def executeIntentBasedOperation( elif entity == "Parzelle": # Create Parzelle from parameters # Import Kontext for kontextInformationen - from modules.datamodels.datamodelRealEstate import Kontext, GeoPolylinie + from modules.features.realestate.datamodelFeatureRealEstate import Kontext, GeoPolylinie # Build parzelle data with all extracted parameters parzelle_data = { @@ -990,7 +1102,7 @@ async def executeIntentBasedOperation( } elif entity == "Gemeinde": # Create Gemeinde from parameters - from modules.datamodels.datamodelRealEstate import Gemeinde + from modules.features.realestate.datamodelFeatureRealEstate import Gemeinde gemeinde = Gemeinde( mandateId=mandateId, label=parameters.get("label", ""), @@ -1005,7 +1117,7 @@ async def executeIntentBasedOperation( } elif entity == "Kanton": # Create Kanton from parameters - from modules.datamodels.datamodelRealEstate import Kanton + from modules.features.realestate.datamodelFeatureRealEstate import Kanton kanton = Kanton( mandateId=mandateId, label=parameters.get("label", ""), @@ -1020,7 +1132,7 @@ async def executeIntentBasedOperation( } elif entity == "Land": # Create Land from parameters - from modules.datamodels.datamodelRealEstate import Land + from modules.features.realestate.datamodelFeatureRealEstate import Land land = Land( mandateId=mandateId, label=parameters.get("label", ""), @@ -1034,7 +1146,7 @@ async def executeIntentBasedOperation( } elif entity == "Dokument": # Create Dokument from parameters - from modules.datamodels.datamodelRealEstate import Dokument + from modules.features.realestate.datamodelFeatureRealEstate import Dokument dokument = Dokument( mandateId=mandateId, label=parameters.get("label", ""), @@ -1195,7 +1307,7 @@ async def executeIntentBasedOperation( "count": len(parzellen) } elif entity == "Gemeinde": - from modules.datamodels.datamodelRealEstate import Gemeinde + from modules.features.realestate.datamodelFeatureRealEstate import Gemeinde gemeindeId = parameters.get("id") if gemeindeId: gemeinde = realEstateInterface.getGemeinde(gemeindeId) @@ -1216,7 +1328,7 @@ async def executeIntentBasedOperation( "count": len(gemeinden) } elif entity == "Kanton": - from modules.datamodels.datamodelRealEstate import Kanton + from modules.features.realestate.datamodelFeatureRealEstate import Kanton kantonId = parameters.get("id") if kantonId: kanton = realEstateInterface.getKanton(kantonId) @@ -1237,7 +1349,7 @@ async def executeIntentBasedOperation( "count": len(kantone) } elif entity == "Land": - from modules.datamodels.datamodelRealEstate import Land + from modules.features.realestate.datamodelFeatureRealEstate import Land landId = parameters.get("id") if landId: land = realEstateInterface.getLand(landId) @@ -1258,7 +1370,7 @@ async def executeIntentBasedOperation( "count": len(laender) } elif entity == "Dokument": - from modules.datamodels.datamodelRealEstate import Dokument + from modules.features.realestate.datamodelFeatureRealEstate import Dokument dokumentId = parameters.get("id") if dokumentId: dokument = realEstateInterface.getDokument(dokumentId) @@ -1322,7 +1434,7 @@ async def executeIntentBasedOperation( "result": updated.model_dump() } elif entity == "Gemeinde": - from modules.datamodels.datamodelRealEstate import Gemeinde + from modules.features.realestate.datamodelFeatureRealEstate import Gemeinde gemeindeId = parameters.get("id") if not gemeindeId: raise ValueError("UPDATE operation requires entity ID") @@ -1339,7 +1451,7 @@ async def executeIntentBasedOperation( "result": updated.model_dump() } elif entity == "Kanton": - from modules.datamodels.datamodelRealEstate import Kanton + from modules.features.realestate.datamodelFeatureRealEstate import Kanton kantonId = parameters.get("id") if not kantonId: raise ValueError("UPDATE operation requires entity ID") @@ -1356,7 +1468,7 @@ async def executeIntentBasedOperation( "result": updated.model_dump() } elif entity == "Land": - from modules.datamodels.datamodelRealEstate import Land + from modules.features.realestate.datamodelFeatureRealEstate import Land landId = parameters.get("id") if not landId: raise ValueError("UPDATE operation requires entity ID") @@ -1373,7 +1485,7 @@ async def executeIntentBasedOperation( "result": updated.model_dump() } elif entity == "Dokument": - from modules.datamodels.datamodelRealEstate import Dokument + from modules.features.realestate.datamodelFeatureRealEstate import Dokument dokumentId = parameters.get("id") if not dokumentId: raise ValueError("UPDATE operation requires entity ID") @@ -1419,7 +1531,7 @@ async def executeIntentBasedOperation( "success": success } elif entity == "Gemeinde": - from modules.datamodels.datamodelRealEstate import Gemeinde + from modules.features.realestate.datamodelFeatureRealEstate import Gemeinde gemeindeId = parameters.get("id") if not gemeindeId: raise ValueError("DELETE operation requires entity ID") @@ -1431,7 +1543,7 @@ async def executeIntentBasedOperation( "success": success } elif entity == "Kanton": - from modules.datamodels.datamodelRealEstate import Kanton + from modules.features.realestate.datamodelFeatureRealEstate import Kanton kantonId = parameters.get("id") if not kantonId: raise ValueError("DELETE operation requires entity ID") @@ -1443,7 +1555,7 @@ async def executeIntentBasedOperation( "success": success } elif entity == "Land": - from modules.datamodels.datamodelRealEstate import Land + from modules.features.realestate.datamodelFeatureRealEstate import Land landId = parameters.get("id") if not landId: raise ValueError("DELETE operation requires entity ID") @@ -1455,7 +1567,7 @@ async def executeIntentBasedOperation( "success": success } elif entity == "Dokument": - from modules.datamodels.datamodelRealEstate import Dokument + from modules.features.realestate.datamodelFeatureRealEstate import Dokument dokumentId = parameters.get("id") if not dokumentId: raise ValueError("DELETE operation requires entity ID") diff --git a/modules/routes/routeFeatureRealEstate.py b/modules/features/realEstate/routeFeatureRealEstate.py similarity index 99% rename from modules/routes/routeFeatureRealEstate.py rename to modules/features/realEstate/routeFeatureRealEstate.py index 73364345..3cb31a2c 100644 --- a/modules/routes/routeFeatureRealEstate.py +++ b/modules/features/realEstate/routeFeatureRealEstate.py @@ -14,7 +14,7 @@ from modules.auth import limiter, getRequestContext, RequestContext # Import models from modules.datamodels.datamodelPagination import PaginationParams, PaginatedResponse, PaginationMetadata -from modules.datamodels.datamodelRealEstate import ( +from .datamodelFeatureRealEstate import ( Projekt, Parzelle, Dokument, @@ -26,10 +26,10 @@ from modules.datamodels.datamodelRealEstate import ( ) # Import interfaces -from modules.interfaces.interfaceDbRealestate import getInterface as getRealEstateInterface +from .interfaceFeatureRealEstate import getInterface as getRealEstateInterface # Import feature logic for AI-powered commands -from modules.features.realEstate.mainRealEstate import ( +from .mainRealEstate import ( processNaturalLanguageCommand, create_project_with_parcel_data, ) diff --git a/modules/datamodels/datamodelTrustee.py b/modules/features/trustee/datamodelFeatureTrustee.py similarity index 100% rename from modules/datamodels/datamodelTrustee.py rename to modules/features/trustee/datamodelFeatureTrustee.py diff --git a/modules/interfaces/interfaceDbTrustee.py b/modules/features/trustee/interfaceFeatureTrustee.py similarity index 99% rename from modules/interfaces/interfaceDbTrustee.py rename to modules/features/trustee/interfaceFeatureTrustee.py index 56ce19b3..dbd8c8aa 100644 --- a/modules/interfaces/interfaceDbTrustee.py +++ b/modules/features/trustee/interfaceFeatureTrustee.py @@ -16,7 +16,7 @@ from modules.interfaces.interfaceRbac import getRecordsetWithRBAC from modules.security.rbac import RbacClass from modules.datamodels.datamodelUam import User, AccessLevel from modules.datamodels.datamodelRbac import AccessRuleContext -from modules.datamodels.datamodelTrustee import ( +from .datamodelFeatureTrustee import ( TrusteeOrganisation, TrusteeRole, TrusteeAccess, diff --git a/modules/features/trustee/mainTrustee.py b/modules/features/trustee/mainTrustee.py new file mode 100644 index 00000000..176317a7 --- /dev/null +++ b/modules/features/trustee/mainTrustee.py @@ -0,0 +1,193 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Trustee Feature Container - Main Module. +Handles feature initialization and RBAC catalog registration. +""" + +import logging +from typing import Dict, List, Any + +logger = logging.getLogger(__name__) + +# Feature metadata +FEATURE_CODE = "trustee" +FEATURE_LABEL = {"en": "Trustee", "de": "Treuhand", "fr": "Fiduciaire"} +FEATURE_ICON = "mdi-briefcase" + +# UI Objects for RBAC catalog +UI_OBJECTS = [ + { + "objectKey": "ui.feature.trustee.organisations", + "label": {"en": "Organisations", "de": "Organisationen", "fr": "Organisations"}, + "meta": {"area": "organisations"} + }, + { + "objectKey": "ui.feature.trustee.contracts", + "label": {"en": "Contracts", "de": "Verträge", "fr": "Contrats"}, + "meta": {"area": "contracts"} + }, + { + "objectKey": "ui.feature.trustee.contracts.tab.documents", + "label": {"en": "Contract Documents", "de": "Vertragsdokumente", "fr": "Documents contractuels"}, + "meta": {"area": "contracts", "element": "tab.documents"} + }, + { + "objectKey": "ui.feature.trustee.contracts.tab.positions", + "label": {"en": "Contract Positions", "de": "Vertragspositionen", "fr": "Positions contractuelles"}, + "meta": {"area": "contracts", "element": "tab.positions"} + }, + { + "objectKey": "ui.feature.trustee.access", + "label": {"en": "Access Management", "de": "Zugriffsverwaltung", "fr": "Gestion des accès"}, + "meta": {"area": "access"} + }, + { + "objectKey": "ui.feature.trustee.roles", + "label": {"en": "Roles", "de": "Rollen", "fr": "Rôles"}, + "meta": {"area": "roles"} + }, +] + +# Resource Objects for RBAC catalog +RESOURCE_OBJECTS = [ + { + "objectKey": "resource.feature.trustee.organisations.create", + "label": {"en": "Create Organisation", "de": "Organisation erstellen", "fr": "Créer organisation"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/organisations", "method": "POST"} + }, + { + "objectKey": "resource.feature.trustee.organisations.update", + "label": {"en": "Update Organisation", "de": "Organisation aktualisieren", "fr": "Modifier organisation"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/organisations/{orgId}", "method": "PUT"} + }, + { + "objectKey": "resource.feature.trustee.organisations.delete", + "label": {"en": "Delete Organisation", "de": "Organisation löschen", "fr": "Supprimer organisation"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/organisations/{orgId}", "method": "DELETE"} + }, + { + "objectKey": "resource.feature.trustee.contracts.create", + "label": {"en": "Create Contract", "de": "Vertrag erstellen", "fr": "Créer contrat"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/contracts", "method": "POST"} + }, + { + "objectKey": "resource.feature.trustee.contracts.update", + "label": {"en": "Update Contract", "de": "Vertrag aktualisieren", "fr": "Modifier contrat"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/contracts/{contractId}", "method": "PUT"} + }, + { + "objectKey": "resource.feature.trustee.contracts.delete", + "label": {"en": "Delete Contract", "de": "Vertrag löschen", "fr": "Supprimer contrat"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/contracts/{contractId}", "method": "DELETE"} + }, + { + "objectKey": "resource.feature.trustee.documents.create", + "label": {"en": "Upload Document", "de": "Dokument hochladen", "fr": "Télécharger document"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/documents", "method": "POST"} + }, + { + "objectKey": "resource.feature.trustee.documents.delete", + "label": {"en": "Delete Document", "de": "Dokument löschen", "fr": "Supprimer document"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/documents/{documentId}", "method": "DELETE"} + }, + { + "objectKey": "resource.feature.trustee.positions.create", + "label": {"en": "Create Position", "de": "Position erstellen", "fr": "Créer position"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/positions", "method": "POST"} + }, + { + "objectKey": "resource.feature.trustee.positions.delete", + "label": {"en": "Delete Position", "de": "Position löschen", "fr": "Supprimer position"}, + "meta": {"endpoint": "/api/trustee/{instanceId}/positions/{positionId}", "method": "DELETE"} + }, +] + +# Template roles for this feature +TEMPLATE_ROLES = [ + { + "roleLabel": "trustee-admin", + "description": { + "en": "Trustee Administrator - Full access to all trustee data and settings", + "de": "Treuhand-Administrator - Vollzugriff auf alle Treuhand-Daten und Einstellungen", + "fr": "Administrateur fiduciaire - Accès complet aux données et paramètres fiduciaires" + } + }, + { + "roleLabel": "trustee-accountant", + "description": { + "en": "Trustee Accountant - Manage accounting and financial data", + "de": "Treuhand-Buchhalter - Buchhaltungs- und Finanzdaten verwalten", + "fr": "Comptable fiduciaire - Gérer les données comptables et financières" + } + }, + { + "roleLabel": "trustee-client", + "description": { + "en": "Trustee Client - View own accounting data and documents", + "de": "Treuhand-Kunde - Eigene Buchhaltungsdaten und Dokumente einsehen", + "fr": "Client fiduciaire - Consulter ses propres données comptables et documents" + } + }, +] + + +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 diff --git a/modules/routes/routeFeatureTrustee.py b/modules/features/trustee/routeFeatureTrustee.py similarity index 99% rename from modules/routes/routeFeatureTrustee.py rename to modules/features/trustee/routeFeatureTrustee.py index 14b0a9e8..bee52513 100644 --- a/modules/routes/routeFeatureTrustee.py +++ b/modules/features/trustee/routeFeatureTrustee.py @@ -18,10 +18,10 @@ import json import io from modules.auth import limiter, getRequestContext, RequestContext -from modules.interfaces.interfaceDbTrustee import getInterface +from .interfaceFeatureTrustee import getInterface from modules.interfaces.interfaceDbApp import getRootInterface from modules.interfaces.interfaceFeatures import getFeatureInterface -from modules.datamodels.datamodelTrustee import ( +from .datamodelFeatureTrustee import ( TrusteeOrganisation, TrusteeRole, TrusteeAccess, diff --git a/modules/interfaces/interfaceAiObjects.py b/modules/interfaces/interfaceAiObjects.py index 5c252ff6..e5aa72cc 100644 --- a/modules/interfaces/interfaceAiObjects.py +++ b/modules/interfaces/interfaceAiObjects.py @@ -10,8 +10,8 @@ import time logger = logging.getLogger(__name__) -from modules.aicore.aicoreModelRegistry import modelRegistry -from modules.aicore.aicoreModelSelector import modelSelector +from modules.features.aichat.aicore.aicoreModelRegistry import modelRegistry +from modules.features.aichat.aicore.aicoreModelSelector import modelSelector from modules.datamodels.datamodelAi import ( AiModel, AiCallOptions, diff --git a/modules/interfaces/interfaceBootstrap.py b/modules/interfaces/interfaceBootstrap.py index cbf8295a..4b291537 100644 --- a/modules/interfaces/interfaceBootstrap.py +++ b/modules/interfaces/interfaceBootstrap.py @@ -30,8 +30,6 @@ from modules.datamodels.datamodelMembership import ( UserMandate, UserMandateRole, ) -from modules.datamodels.datamodelFeatures import Feature - logger = logging.getLogger(__name__) # Password-Hashing @@ -56,15 +54,9 @@ def initBootstrap(db: DatabaseConnector) -> None: # Initialize roles FIRST (needed for AccessRules) initRoles(db) - # Initialize features (trustee, chatbot, etc.) - initFeatures(db) - # Initialize RBAC rules (uses roleIds from roles) initRbacRules(db) - # Initialize AccessRules for feature-template roles (idempotent - adds missing rules) - _initFeatureTemplateRoleAccessRules(db) - # Initialize admin user adminUserId = initAdminUser(db, mandateId) @@ -247,233 +239,6 @@ def initRoles(db: DatabaseConnector) -> None: logger.info("Roles initialization completed") -def initFeatures(db: DatabaseConnector) -> None: - """ - Initialize standard features if they don't exist. - - Features are global definitions that can be instantiated within mandates. - Each feature has a unique code (e.g., 'trustee', 'chatbot'). - - Args: - db: Database connector instance - """ - logger.info("Initializing features") - - # Standard features available in the system - standardFeatures = [ - Feature( - code="trustee", - label={"en": "Trustee", "de": "Treuhand", "fr": "Fiduciaire"}, - icon="mdi-briefcase" - ), - Feature( - code="chatbot", - label={"en": "Chatbot", "de": "Chatbot", "fr": "Chatbot"}, - icon="mdi-robot" - ), - Feature( - code="chatworkflow", - label={"en": "Chat Workflow", "de": "Chat-Workflow", "fr": "Workflow de Chat"}, - icon="mdi-message-cog" - ), - Feature( - code="neutralization", - label={"en": "Neutralization", "de": "Neutralisierung", "fr": "Neutralisation"}, - icon="mdi-shield-check" - ), - Feature( - code="realestate", - label={"en": "Real Estate", "de": "Immobilien", "fr": "Immobilier"}, - icon="mdi-home-city" - ), - ] - - existingFeatures = db.getRecordset(Feature) - existingCodes = {f.get("code") for f in existingFeatures} - - for feature in standardFeatures: - if feature.code not in existingCodes: - try: - db.recordCreate(Feature, feature.model_dump()) - logger.info(f"Created feature: {feature.code}") - except Exception as e: - logger.warning(f"Error creating feature {feature.code}: {e}") - else: - logger.debug(f"Feature {feature.code} already exists") - - # Initialize feature-specific template roles - _initFeatureTemplateRoles(db) - - logger.info("Features initialization completed") - - -def _initFeatureTemplateRoles(db: DatabaseConnector) -> None: - """ - Initialize feature-specific template roles. - - These are global template roles (mandateId=None, featureInstanceId=None) - that get copied when a new FeatureInstance is created. - - Template roles are NOT system roles (isSystemRole=False) and can be - modified or deleted by administrators. - - Args: - db: Database connector instance - """ - logger.info("Initializing feature-specific template roles") - - # Feature-specific template roles definition - # Each feature has its own set of roles with appropriate descriptions - featureTemplateRoles = { - "trustee": [ - { - "roleLabel": "trustee-admin", - "description": { - "en": "Trustee Administrator - Full access to all trustee data and settings", - "de": "Treuhand-Administrator - Vollzugriff auf alle Treuhand-Daten und Einstellungen", - "fr": "Administrateur fiduciaire - Accès complet aux données et paramètres fiduciaires" - } - }, - { - "roleLabel": "trustee-accountant", - "description": { - "en": "Trustee Accountant - Manage accounting and financial data", - "de": "Treuhand-Buchhalter - Buchhaltungs- und Finanzdaten verwalten", - "fr": "Comptable fiduciaire - Gérer les données comptables et financières" - } - }, - { - "roleLabel": "trustee-client", - "description": { - "en": "Trustee Client - View own accounting data and documents", - "de": "Treuhand-Kunde - Eigene Buchhaltungsdaten und Dokumente einsehen", - "fr": "Client fiduciaire - Consulter ses propres données comptables et documents" - } - }, - ], - "chatbot": [ - { - "roleLabel": "chatbot-admin", - "description": { - "en": "Chatbot Administrator - Full access to chatbot settings and all conversations", - "de": "Chatbot-Administrator - Vollzugriff auf Chatbot-Einstellungen und alle Konversationen", - "fr": "Administrateur chatbot - Accès complet aux paramètres et conversations" - } - }, - { - "roleLabel": "chatbot-user", - "description": { - "en": "Chatbot User - Use chatbot and view own conversations", - "de": "Chatbot-Benutzer - Chatbot nutzen und eigene Konversationen einsehen", - "fr": "Utilisateur chatbot - Utiliser le chatbot et consulter ses conversations" - } - }, - ], - "chatworkflow": [ - { - "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" - } - }, - ], - "neutralization": [ - { - "roleLabel": "neutralization-admin", - "description": { - "en": "Neutralization Administrator - Full access to neutralization settings and data", - "de": "Neutralisierungs-Administrator - Vollzugriff auf Neutralisierungs-Einstellungen und Daten", - "fr": "Administrateur neutralisation - Accès complet aux paramètres et données" - } - }, - { - "roleLabel": "neutralization-analyst", - "description": { - "en": "Neutralization Analyst - Analyze and process neutralization data", - "de": "Neutralisierungs-Analyst - Neutralisierungsdaten analysieren und verarbeiten", - "fr": "Analyste neutralisation - Analyser et traiter les données de neutralisation" - } - }, - ], - "realestate": [ - { - "roleLabel": "realestate-admin", - "description": { - "en": "Real Estate Administrator - Full access to all property data and settings", - "de": "Immobilien-Administrator - Vollzugriff auf alle Immobiliendaten und Einstellungen", - "fr": "Administrateur immobilier - Accès complet aux données et paramètres" - } - }, - { - "roleLabel": "realestate-manager", - "description": { - "en": "Real Estate Manager - Manage properties and tenants", - "de": "Immobilien-Verwalter - Immobilien und Mieter verwalten", - "fr": "Gestionnaire immobilier - Gérer les propriétés et locataires" - } - }, - { - "roleLabel": "realestate-viewer", - "description": { - "en": "Real Estate Viewer - View property information", - "de": "Immobilien-Betrachter - Immobilien-Informationen einsehen", - "fr": "Visualiseur immobilier - Consulter les informations immobilières" - } - }, - ], - } - - # Get existing template roles (mandateId=None, featureCode set) - existingRoles = db.getRecordset(Role, recordFilter={"mandateId": None}) - existingRoleKeys = { - (r.get("featureCode"), r.get("roleLabel")) - for r in existingRoles - if r.get("featureCode") is not None - } - - createdCount = 0 - for featureCode, roles in featureTemplateRoles.items(): - for roleDef in roles: - roleKey = (featureCode, roleDef["roleLabel"]) - if roleKey not in existingRoleKeys: - try: - templateRole = Role( - roleLabel=roleDef["roleLabel"], - description=roleDef["description"], - mandateId=None, # Global template role - featureInstanceId=None, - featureCode=featureCode, - isSystemRole=False # Can be deleted by admins - ) - db.recordCreate(Role, templateRole) - createdCount += 1 - logger.info(f"Created template role: {roleDef['roleLabel']} for feature {featureCode}") - except Exception as e: - logger.warning(f"Error creating template role {roleDef['roleLabel']}: {e}") - else: - logger.debug(f"Template role {roleDef['roleLabel']} for {featureCode} already exists") - - logger.info(f"Feature template roles initialization completed ({createdCount} created)") - - def _getRoleId(db: DatabaseConnector, roleLabel: str) -> Optional[str]: """ Get role ID by label, using cache or database lookup. @@ -501,190 +266,6 @@ def _getRoleId(db: DatabaseConnector, roleLabel: str) -> Optional[str]: return None -def _initFeatureTemplateRoleAccessRules(db: DatabaseConnector) -> None: - """ - Initialize AccessRules for feature-template roles. - This is idempotent - only adds rules that don't exist yet. - - Feature-template roles need explicit AccessRules for their respective tables: - - trustee-admin/accountant/client -> TrusteeOrganisation, TrusteeContract, etc. - - chatbot-admin/user -> ChatSession, etc. - - workflow-admin/editor/viewer -> ChatWorkflow, etc. - - Args: - db: Database connector instance - """ - logger.info("Checking feature-template role AccessRules") - - # Define feature-specific table access - featureTableAccess = { - "trustee": { - "tables": [ - "TrusteeOrganisation", "TrusteeRole", "TrusteeAccess", - "TrusteeContract", "TrusteeDocument", "TrusteePosition", - "TrusteePositionDocument" - ], - "roles": { - "trustee-admin": { - "view": True, - "read": AccessLevel.ALL, - "create": AccessLevel.ALL, - "update": AccessLevel.ALL, - "delete": AccessLevel.ALL - }, - "trustee-accountant": { - "view": True, - "read": AccessLevel.GROUP, - "create": AccessLevel.GROUP, - "update": AccessLevel.GROUP, - "delete": AccessLevel.NONE - }, - "trustee-client": { - "view": True, - "read": AccessLevel.MY, - "create": AccessLevel.NONE, - "update": AccessLevel.NONE, - "delete": AccessLevel.NONE - } - } - }, - "chatbot": { - "tables": ["ChatSession", "ChatMessage"], - "roles": { - "chatbot-admin": { - "view": True, - "read": AccessLevel.ALL, - "create": AccessLevel.ALL, - "update": AccessLevel.ALL, - "delete": AccessLevel.ALL - }, - "chatbot-user": { - "view": True, - "read": AccessLevel.MY, - "create": AccessLevel.MY, - "update": AccessLevel.MY, - "delete": AccessLevel.MY - } - } - }, - "chatworkflow": { - "tables": ["ChatWorkflow", "AutomationDefinition"], - "roles": { - "workflow-admin": { - "view": True, - "read": AccessLevel.ALL, - "create": AccessLevel.ALL, - "update": AccessLevel.ALL, - "delete": AccessLevel.ALL - }, - "workflow-editor": { - "view": True, - "read": AccessLevel.GROUP, - "create": AccessLevel.GROUP, - "update": AccessLevel.GROUP, - "delete": AccessLevel.NONE - }, - "workflow-viewer": { - "view": True, - "read": AccessLevel.GROUP, - "create": AccessLevel.NONE, - "update": AccessLevel.NONE, - "delete": AccessLevel.NONE - } - } - }, - "neutralization": { - "tables": ["DataNeutraliserConfig", "DataNeutralizerAttributes"], - "roles": { - "neutralization-admin": { - "view": True, - "read": AccessLevel.ALL, - "create": AccessLevel.ALL, - "update": AccessLevel.ALL, - "delete": AccessLevel.ALL - }, - "neutralization-analyst": { - "view": True, - "read": AccessLevel.GROUP, - "create": AccessLevel.NONE, - "update": AccessLevel.NONE, - "delete": AccessLevel.NONE - } - } - }, - "realestate": { - "tables": ["Projekt", "Parzelle", "Dokument", "Gemeinde", "Kanton", "Land"], - "roles": { - "realestate-admin": { - "view": True, - "read": AccessLevel.ALL, - "create": AccessLevel.ALL, - "update": AccessLevel.ALL, - "delete": AccessLevel.ALL - }, - "realestate-manager": { - "view": True, - "read": AccessLevel.GROUP, - "create": AccessLevel.GROUP, - "update": AccessLevel.GROUP, - "delete": AccessLevel.NONE - }, - "realestate-viewer": { - "view": True, - "read": AccessLevel.GROUP, - "create": AccessLevel.NONE, - "update": AccessLevel.NONE, - "delete": AccessLevel.NONE - } - } - } - } - - createdCount = 0 - - for featureCode, featureConfig in featureTableAccess.items(): - tables = featureConfig["tables"] - roles = featureConfig["roles"] - - for roleLabel, permissions in roles.items(): - roleId = _getRoleId(db, roleLabel) - if not roleId: - continue - - for tableName in tables: - # Check if rule already exists - existingRules = db.getRecordset( - AccessRule, - recordFilter={ - "roleId": roleId, - "context": AccessRuleContext.DATA, - "item": tableName - } - ) - - if existingRules: - continue # Rule already exists - - # Create new rule - rule = AccessRule( - roleId=roleId, - context=AccessRuleContext.DATA, - item=tableName, - view=permissions["view"], - read=permissions["read"], - create=permissions["create"], - update=permissions["update"], - delete=permissions["delete"] - ) - db.recordCreate(AccessRule, rule) - createdCount += 1 - - if createdCount > 0: - logger.info(f"Created {createdCount} feature-template role AccessRules") - else: - logger.debug("All feature-template role AccessRules already exist") - - def initRbacRules(db: DatabaseConnector) -> None: """ Initialize RBAC rules if they don't exist. diff --git a/modules/interfaces/interfaceDbApp.py b/modules/interfaces/interfaceDbApp.py index ed8e1fc4..5b6633cb 100644 --- a/modules/interfaces/interfaceDbApp.py +++ b/modules/interfaces/interfaceDbApp.py @@ -36,7 +36,7 @@ from modules.datamodels.datamodelRbac import ( ) from modules.datamodels.datamodelUam import AccessLevel from modules.datamodels.datamodelSecurity import Token, AuthEvent, TokenStatus -from modules.datamodels.datamodelNeutralizer import ( +from modules.features.neutralizer.datamodelFeatureNeutralizer import ( DataNeutraliserConfig, DataNeutralizerAttributes, ) diff --git a/modules/routes/routeAdminAutomationEvents.py b/modules/routes/routeAdminAutomationEvents.py index c62977aa..9202e448 100644 --- a/modules/routes/routeAdminAutomationEvents.py +++ b/modules/routes/routeAdminAutomationEvents.py @@ -10,8 +10,8 @@ from typing import List, Dict, Any from fastapi import status import logging -# Import interfaces and models -import modules.interfaces.interfaceDbChat as interfaceDbChat +# Import interfaces and models from feature containers +import modules.features.aichat.interfaceFeatureAiChat as interfaceDbChat from modules.auth import limiter, getRequestContext, requireSysAdmin, RequestContext from modules.datamodels.datamodelUam import User @@ -76,9 +76,9 @@ async def sync_all_automation_events( This will register/remove events based on active flags. """ try: - from modules.interfaces.interfaceDbChat import getInterface as getChatInterface + from modules.features.aichat.interfaceFeatureAiChat import getInterface as getChatInterface from modules.interfaces.interfaceDbApp import getRootInterface - from modules.features.workflow import syncAutomationEvents + from modules.workflows.automation import syncAutomationEvents chatInterface = getChatInterface(currentUser) # Get event user for sync operation (routes can import from interfaces) diff --git a/modules/routes/routeDataWorkflows.py b/modules/routes/routeDataWorkflows.py index d3b2d825..b4013de1 100644 --- a/modules/routes/routeDataWorkflows.py +++ b/modules/routes/routeDataWorkflows.py @@ -13,13 +13,13 @@ from fastapi import APIRouter, HTTPException, Depends, Body, Path, Query, Respon # Import auth modules from modules.auth import limiter, getCurrentUser -# Import interfaces -import modules.interfaces.interfaceDbChat as interfaceDbChat -from modules.interfaces.interfaceDbChat import getInterface +# Import interfaces from feature containers +import modules.features.aichat.interfaceFeatureAiChat as interfaceDbChat +from modules.features.aichat.interfaceFeatureAiChat import getInterface from modules.interfaces.interfaceRbac import getRecordsetWithRBAC -# Import models -from modules.datamodels.datamodelChat import ( +# Import models from feature containers +from modules.features.aichat.datamodelFeatureAiChat import ( ChatWorkflow, ChatMessage, ChatLog, diff --git a/modules/routes/routeOptions.py b/modules/routes/routeOptions.py deleted file mode 100644 index a2acad76..00000000 --- a/modules/routes/routeOptions.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) 2025 Patrick Motsch -# All rights reserved. -""" -Options API routes for dynamic frontend options. -Provides endpoints for fetching options for select/multiselect fields. -""" - -from fastapi import APIRouter, HTTPException, Depends, Query, Request -from typing import List, Dict, Any -import logging - -from modules.auth import getCurrentUser, limiter -from modules.datamodels.datamodelUam import User -from modules.features.dynamicOptions.mainDynamicOptions import getOptions, getAvailableOptionsNames -from modules.services import getInterface as getServices - -# Configure logger -logger = logging.getLogger(__name__) - -router = APIRouter( - prefix="/api/options", - tags=["Options"], - responses={404: {"description": "Not found"}} -) - - -@router.get("/{optionsName}", response_model=List[Dict[str, Any]]) -@limiter.limit("120/minute") -async def getOptionsEndpoint( - request: Request, - optionsName: str, - currentUser: User = Depends(getCurrentUser) -) -> List[Dict[str, Any]]: - """ - Get options for a given options name. - - Path Parameters: - - optionsName: Name of the options set (e.g., "user.role", "user.connection") - - Returns: - - List of option dictionaries with "value" and "label" keys - - Examples: - - GET /api/options/user.role - - GET /api/options/user.connection - - GET /api/options/auth.authority - - GET /api/options/connection.status - """ - try: - logger.debug(f"Options request: {optionsName} for user {currentUser.id}") - services = getServices(currentUser, None) - options = getOptions(optionsName, services, currentUser) - logger.debug(f"Options response: {optionsName} returned {len(options)} items") - return options - except ValueError as e: - logger.error(f"ValueError for options {optionsName}: {str(e)}") - raise HTTPException( - status_code=400, - detail=str(e) - ) - except Exception as e: - logger.error(f"Error getting options for {optionsName}: {str(e)}") - raise HTTPException( - status_code=500, - detail=f"Failed to get options: {str(e)}" - ) - - -@router.get("/", response_model=List[str]) -@limiter.limit("30/minute") -async def listAvailableOptions( - request: Request, - currentUser: User = Depends(getCurrentUser) -) -> List[str]: - """ - Get list of all available options names. - - Returns: - - List of available options names - """ - try: - return getAvailableOptionsNames() - except Exception as e: - logger.error(f"Error listing available options: {str(e)}") - raise HTTPException( - status_code=500, - detail=f"Failed to list options: {str(e)}" - ) diff --git a/modules/security/rbacCatalog.py b/modules/security/rbacCatalog.py new file mode 100644 index 00000000..f52adf21 --- /dev/null +++ b/modules/security/rbacCatalog.py @@ -0,0 +1,151 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +RBAC Catalog Service. +Central registry for Feature RBAC objects (UI and RESOURCE). + +Feature-Container register their RBAC objects via mainXxx.py at startup. +""" + +import logging +from typing import Dict, List, Any, Optional +from threading import Lock + +logger = logging.getLogger(__name__) + + +class RbacCatalogService: + """ + Central RBAC Catalog for Feature UI and RESOURCE objects. + Singleton service that stores all registered RBAC objects from feature containers. + """ + + _instance = None + _lock = Lock() + + def __new__(cls): + if cls._instance is None: + with cls._lock: + if cls._instance is None: + cls._instance = super().__new__(cls) + cls._instance._initialized = False + return cls._instance + + def __init__(self): + if self._initialized: + return + + self._uiObjects: Dict[str, Dict[str, Any]] = {} + self._resourceObjects: Dict[str, Dict[str, Any]] = {} + self._featureDefinitions: Dict[str, Dict[str, Any]] = {} + self._templateRoles: Dict[str, List[Dict[str, Any]]] = {} + self._initialized = True + logger.info("RBAC Catalog Service initialized") + + def registerUiObject(self, featureCode: str, objectKey: str, label: Dict[str, str], meta: Optional[Dict[str, Any]] = None) -> bool: + """Register a UI object for a feature.""" + try: + self._uiObjects[objectKey] = {"objectKey": objectKey, "featureCode": featureCode, "label": label, "meta": meta or {}, "type": "UI"} + return True + except Exception as e: + logger.error(f"Failed to register UI object {objectKey}: {e}") + return False + + def registerResourceObject(self, featureCode: str, objectKey: str, label: Dict[str, str], meta: Optional[Dict[str, Any]] = None) -> bool: + """Register a RESOURCE object for a feature.""" + try: + self._resourceObjects[objectKey] = {"objectKey": objectKey, "featureCode": featureCode, "label": label, "meta": meta or {}, "type": "RESOURCE"} + return True + except Exception as e: + logger.error(f"Failed to register RESOURCE object {objectKey}: {e}") + return False + + def registerFeatureDefinition(self, featureCode: str, label: Dict[str, str], icon: str) -> bool: + """Register a feature definition.""" + try: + self._featureDefinitions[featureCode] = {"code": featureCode, "label": label, "icon": icon} + return True + except Exception as e: + logger.error(f"Failed to register feature definition {featureCode}: {e}") + return False + + def registerTemplateRoles(self, featureCode: str, roles: List[Dict[str, Any]]) -> bool: + """Register template roles for a feature.""" + try: + self._templateRoles[featureCode] = roles + return True + except Exception as e: + logger.error(f"Failed to register template roles for {featureCode}: {e}") + return False + + def getUiObjects(self, featureCode: Optional[str] = None) -> List[Dict[str, Any]]: + """Get all UI objects, optionally filtered by feature.""" + if featureCode: + return [obj for obj in self._uiObjects.values() if obj["featureCode"] == featureCode] + return list(self._uiObjects.values()) + + def getResourceObjects(self, featureCode: Optional[str] = None) -> List[Dict[str, Any]]: + """Get all RESOURCE objects, optionally filtered by feature.""" + if featureCode: + return [obj for obj in self._resourceObjects.values() if obj["featureCode"] == featureCode] + return list(self._resourceObjects.values()) + + def getAllObjects(self, featureCode: Optional[str] = None) -> List[Dict[str, Any]]: + """Get all RBAC objects (UI + RESOURCE), optionally filtered by feature.""" + return self.getUiObjects(featureCode) + self.getResourceObjects(featureCode) + + def getFeatureDefinitions(self) -> List[Dict[str, Any]]: + """Get all registered feature definitions.""" + return list(self._featureDefinitions.values()) + + def getFeatureDefinition(self, featureCode: str) -> Optional[Dict[str, Any]]: + """Get a specific feature definition.""" + return self._featureDefinitions.get(featureCode) + + def getTemplateRoles(self, featureCode: str) -> List[Dict[str, Any]]: + """Get template roles for a feature.""" + return self._templateRoles.get(featureCode, []) + + def getAllTemplateRoles(self) -> Dict[str, List[Dict[str, Any]]]: + """Get all template roles grouped by feature.""" + return self._templateRoles.copy() + + def getRegisteredFeatures(self) -> List[str]: + """Get list of all registered feature codes.""" + return list(self._featureDefinitions.keys()) + + def unregisterFeature(self, featureCode: str) -> bool: + """Unregister all objects for a feature.""" + try: + for key in [k for k, v in self._uiObjects.items() if v["featureCode"] == featureCode]: + del self._uiObjects[key] + for key in [k for k, v in self._resourceObjects.items() if v["featureCode"] == featureCode]: + del self._resourceObjects[key] + self._featureDefinitions.pop(featureCode, None) + self._templateRoles.pop(featureCode, None) + logger.info(f"Unregistered feature: {featureCode}") + return True + except Exception as e: + logger.error(f"Failed to unregister feature {featureCode}: {e}") + return False + + def getCatalogStats(self) -> Dict[str, Any]: + """Get statistics about the catalog.""" + return { + "features": len(self._featureDefinitions), + "uiObjects": len(self._uiObjects), + "resourceObjects": len(self._resourceObjects), + "templateRoles": sum(len(roles) for roles in self._templateRoles.values()) + } + + +# Singleton accessor +_catalogService: Optional[RbacCatalogService] = None + + +def getCatalogService() -> RbacCatalogService: + """Get the singleton RBAC Catalog Service instance.""" + global _catalogService + if _catalogService is None: + _catalogService = RbacCatalogService() + return _catalogService diff --git a/modules/services/__init__.py b/modules/services/__init__.py index ff91dc6b..b5d124ff 100644 --- a/modules/services/__init__.py +++ b/modules/services/__init__.py @@ -1,17 +1,34 @@ # Copyright (c) 2025 Patrick Motsch # All rights reserved. -from typing import Any, Optional +""" +Services Module. +Central service registry that provides access to shared services. + +IMPORTANT: Import-Regelwerk +- Zentrale Module (wie dieses) dürfen KEINE Feature-Container importieren +- Feature-spezifische Services werden dynamisch geladen +- Nur Shared Services werden direkt geladen +""" + +import os +import importlib +import glob +from typing import Any, Optional, TYPE_CHECKING +import logging from modules.datamodels.datamodelUam import User -from modules.datamodels.datamodelChat import ChatWorkflow + +if TYPE_CHECKING: + from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow + +logger = logging.getLogger(__name__) + +# Path to feature containers +_FEATURES_DIR = os.path.join(os.path.dirname(os.path.dirname(__file__)), "features") + class PublicService: - """Lightweight proxy exposing only public callable attributes of a target. - - - Hides names starting with '_' - - Optionally restricts to callables only - - Optional name_filter predicate for allow-list patterns - """ + """Lightweight proxy exposing only public callable attributes of a target.""" def __init__(self, target: Any, functionsOnly: bool = True, nameFilter=None): self._target = target @@ -29,57 +46,44 @@ class PublicService: return attr def __dir__(self): - names = [ + return sorted([ n for n in dir(self._target) if not n.startswith('_') and (not self._functionsOnly or callable(getattr(self._target, n, None))) and (self._nameFilter(n) if self._nameFilter else True) - ] - return sorted(names) + ]) class Services: + """ + Central Services class providing access to all services. + + Import-Regelwerk: + - Shared Services are loaded directly (from modules/services/) + - Feature-specific Services are loaded dynamically via filename discovery + """ - def __init__(self, user: User, workflow: ChatWorkflow = None, mandateId: Optional[str] = None): + def __init__(self, user: User, workflow: "ChatWorkflow" = None, mandateId: Optional[str] = None): self.user: User = user - self.workflow: ChatWorkflow = workflow + self.workflow = workflow self.mandateId: Optional[str] = mandateId - self.currentUserPrompt: str = "" # Cleaned/normalized user intent for the current round - self.rawUserPrompt: str = "" # Original raw user message for the current round + self.currentUserPrompt: str = "" + self.rawUserPrompt: str = "" - # Initialize interfaces with explicit mandateId - - from modules.interfaces.interfaceDbChat import getInterface as getChatInterface - self.interfaceDbChat = getChatInterface(user, mandateId=mandateId) - + # Initialize central interfaces from modules.interfaces.interfaceDbApp import getInterface as getAppInterface self.interfaceDbApp = getAppInterface(user, mandateId=mandateId) from modules.interfaces.interfaceDbManagement import getInterface as getComponentInterface self.interfaceDbComponent = getComponentInterface(user, mandateId=mandateId) - from modules.interfaces.interfaceDbTrustee import getInterface as getTrusteeInterface - self.interfaceDbTrustee = getTrusteeInterface(user, mandateId=mandateId) - - # Expose RBAC directly on services for convenience self.rbac = self.interfaceDbApp.rbac if self.interfaceDbApp else None - # Initialize service packages - - from .serviceExtraction.mainServiceExtraction import ExtractionService - self.extraction = PublicService(ExtractionService(self)) - - from .serviceGeneration.mainServiceGeneration import GenerationService - self.generation = PublicService(GenerationService(self)) - - from .serviceNeutralization.mainServiceNeutralization import NeutralizationService - self.neutralization = PublicService(NeutralizationService(self)) - + # ============================================================ + # SHARED SERVICES (from modules/services/) + # ============================================================ from .serviceSharepoint.mainServiceSharepoint import SharepointService self.sharepoint = PublicService(SharepointService(self)) - - from .serviceAi.mainServiceAi import AiService - self.ai = PublicService(AiService(self), functionsOnly=False) from .serviceTicket.mainServiceTicket import TicketService self.ticket = PublicService(TicketService(self)) @@ -90,25 +94,82 @@ class Services: from .serviceUtils.mainServiceUtils import UtilsService self.utils = PublicService(UtilsService(self)) - from .serviceWeb.mainServiceWeb import WebService - self.web = PublicService(WebService(self)) - from .serviceSecurity.mainServiceSecurity import SecurityService self.security = PublicService(SecurityService(self)) from .serviceMessaging.mainServiceMessaging import MessagingService self.messaging = PublicService(MessagingService(self)) - -def getInterface(user: User, workflow: ChatWorkflow = None, mandateId: Optional[str] = None) -> Services: - """ - Get Services instance for the given user and mandate context. + # ============================================================ + # FEATURE SERVICES (dynamically loaded by filename discovery) + # ============================================================ + self._loadFeatureInterfaces() + self._loadFeatureServices() - Args: - user: The authenticated user - workflow: Optional ChatWorkflow context - mandateId: Explicit mandate context (from RequestContext / X-Mandate-Id header). Required. - """ + def _loadFeatureInterfaces(self): + """Dynamically load interfaces from feature containers by filename pattern.""" + # Find all interfaceFeature*.py files + pattern = os.path.join(_FEATURES_DIR, "*", "interfaceFeature*.py") + for filepath in glob.glob(pattern): + try: + # Extract feature name and interface name + featureDir = os.path.basename(os.path.dirname(filepath)) + filename = os.path.basename(filepath)[:-3] # Remove .py + + # Build module path: modules.features.. + modulePath = f"modules.features.{featureDir}.{filename}" + module = importlib.import_module(modulePath) + + # Get interface via getInterface() + if hasattr(module, "getInterface"): + interface = module.getInterface(self.user, mandateId=self.mandateId) + # Derive attribute name: interfaceFeatureAiChat -> interfaceDbChat + attrName = filename.replace("interfaceFeature", "interfaceDb") + setattr(self, attrName, interface) + logger.debug(f"Loaded interface: {attrName} from {modulePath}") + except Exception as e: + logger.debug(f"Could not load interface from {filepath}: {e}") + + def _loadFeatureServices(self): + """Dynamically load services from feature containers by filename pattern.""" + # Find all service*/mainService*.py files in feature containers + pattern = os.path.join(_FEATURES_DIR, "*", "service*", "mainService*.py") + for filepath in glob.glob(pattern): + try: + # Extract paths + serviceDir = os.path.basename(os.path.dirname(filepath)) + featureDir = os.path.basename(os.path.dirname(os.path.dirname(filepath))) + filename = os.path.basename(filepath)[:-3] # Remove .py + + # Build module path: modules.features... + modulePath = f"modules.features.{featureDir}.{serviceDir}.{filename}" + module = importlib.import_module(modulePath) + + # Find service class (ends with "Service") + serviceClass = None + for name in dir(module): + if name.endswith("Service") and not name.startswith("_"): + cls = getattr(module, name) + if isinstance(cls, type): + serviceClass = cls + break + + if serviceClass: + # Derive attribute name: serviceAi -> ai, serviceExtraction -> extraction + attrName = serviceDir.replace("service", "").lower() + if not attrName: + attrName = serviceDir.lower() + + # Check if it needs functionsOnly=False (for AI service) + functionsOnly = attrName != "ai" + + serviceInstance = serviceClass(self) + setattr(self, attrName, PublicService(serviceInstance, functionsOnly=functionsOnly)) + logger.debug(f"Loaded service: {attrName} from {modulePath}") + except Exception as e: + logger.debug(f"Could not load service from {filepath}: {e}") + + +def getInterface(user: User, workflow: "ChatWorkflow" = None, mandateId: Optional[str] = None) -> Services: + """Get Services instance for the given user and mandate context.""" return Services(user, workflow, mandateId=mandateId) - - diff --git a/modules/services/serviceChat/mainServiceChat.py b/modules/services/serviceChat/mainServiceChat.py index 137dcd05..ec4cad6b 100644 --- a/modules/services/serviceChat/mainServiceChat.py +++ b/modules/services/serviceChat/mainServiceChat.py @@ -3,7 +3,7 @@ import logging from typing import Dict, Any, List, Optional from modules.datamodels.datamodelUam import User, UserConnection -from modules.datamodels.datamodelChat import ChatDocument, ChatMessage, ChatStat, ChatLog +from modules.features.aichat.datamodelFeatureAiChat import ChatDocument, ChatMessage, ChatStat, ChatLog from modules.datamodels.datamodelAi import AiCallOptions, OperationTypeEnum, PriorityEnum, ProcessingModeEnum from modules.shared.progressLogger import ProgressLogger diff --git a/modules/services/serviceUtils/mainServiceUtils.py b/modules/services/serviceUtils/mainServiceUtils.py index 2c975f1d..afdad31b 100644 --- a/modules/services/serviceUtils/mainServiceUtils.py +++ b/modules/services/serviceUtils/mainServiceUtils.py @@ -161,7 +161,7 @@ class UtilsService: Mirrors storeDebugMessageAndDocuments() in modules.interfaces.interfaceDbChat. """ try: - from modules.interfaces.interfaceDbChat import storeDebugMessageAndDocuments as _storeDebugMessageAndDocuments + from modules.features.aichat.interfaceFeatureAiChat import storeDebugMessageAndDocuments as _storeDebugMessageAndDocuments _storeDebugMessageAndDocuments(message, currentUser) except Exception: # Silent fail to never break main flow diff --git a/modules/features/workflow/__init__.py b/modules/workflows/automation/__init__.py similarity index 100% rename from modules/features/workflow/__init__.py rename to modules/workflows/automation/__init__.py diff --git a/modules/features/workflow/mainWorkflow.py b/modules/workflows/automation/mainWorkflow.py similarity index 99% rename from modules/features/workflow/mainWorkflow.py rename to modules/workflows/automation/mainWorkflow.py index 70a2e9aa..43df551c 100644 --- a/modules/features/workflow/mainWorkflow.py +++ b/modules/workflows/automation/mainWorkflow.py @@ -12,7 +12,7 @@ import logging import json from typing import Dict, Any, Optional -from modules.datamodels.datamodelChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum, AutomationDefinition +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, UserInputRequest, WorkflowModeEnum, AutomationDefinition from modules.datamodels.datamodelUam import User from modules.shared.timeUtils import getUtcTimestamp from modules.shared.eventManagement import eventManager diff --git a/modules/workflows/automation/subAutomationSchedule.py b/modules/workflows/automation/subAutomationSchedule.py new file mode 100644 index 00000000..1061d65e --- /dev/null +++ b/modules/workflows/automation/subAutomationSchedule.py @@ -0,0 +1,64 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Automation Lifecycle Manager. +Handles startup and shutdown of scheduled automations. + +Note: This module is NOT for feature container lifecycle - it only manages +the automation scheduler (loading/syncing scheduled automation events). +""" + +import logging +from modules.services import getInterface as getServices + +logger = logging.getLogger(__name__) + + +async def start(eventUser) -> None: + """ + Start automation scheduler and sync scheduled events. + + Args: + eventUser: System-level event user for background operations (provided by app.py) + """ + if not eventUser: + logger.warning("Automation: No event user provided, skipping automation sync") + return True + + try: + from modules.workflows.automation import syncAutomationEvents + from modules.shared.callbackRegistry import callbackRegistry + + # Get services for event user (provides access to interfaces) + services = getServices(eventUser, None) + + # Register callback for automation changes + async def onAutomationChanged(chatInterface): + """Callback triggered when automations are created/updated/deleted.""" + eventServices = getServices(eventUser, None) + await syncAutomationEvents(eventServices, eventUser) + + callbackRegistry.register('automation.changed', onAutomationChanged) + logger.info("Automation: Registered change callback") + + # Initial sync on startup + await syncAutomationEvents(services, eventUser) + logger.info("Automation: Scheduled events synced on startup") + + except Exception as e: + logger.error(f"Automation: Error setting up events on startup: {str(e)}") + # Don't fail startup if automation sync fails + + return True + + +async def stop(eventUser) -> None: + """ + Stop automation scheduler. + + Args: + eventUser: System-level event user (provided by app.py) + """ + # Callbacks will remain registered (acceptable for shutdown) + logger.info("Automation: Scheduler stopped (callbacks cleaned up on shutdown)") + return True diff --git a/modules/workflows/automation/subAutomationTemplates.py b/modules/workflows/automation/subAutomationTemplates.py new file mode 100644 index 00000000..95c1eb77 --- /dev/null +++ b/modules/workflows/automation/subAutomationTemplates.py @@ -0,0 +1,385 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Automation templates for workflow definitions. + +Contains predefined workflow templates that can be used to create automation definitions. +""" + +from typing import Dict, Any, List + +# Automation templates structure +AUTOMATION_TEMPLATES: Dict[str, Any] = { + "sets": [ + { + "template": { + "overview": "SharePoint Themen Zusammenfassung", + "tasks": [ + { + "id": "Task01", + "title": "SharePoint Themen Zusammenfassung", + "description": "Erstellt eine Zusammenfassung aller SharePoint Sites und deren Inhalte", + "objective": "Erstelle eine Zusammenfassung aller SharePoint Themen (Sites) und deren Inhalte als Word-Dokument", + "actionList": [ + { + "execMethod": "sharepoint", + "execAction": "findDocumentPath", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "searchQuery": "*", + "maxResults": 100 + }, + "execResultLabel": "sharepoint_sites_found" + }, + { + "execMethod": "sharepoint", + "execAction": "listDocuments", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "pathQuery": "{{KEY:sharepointBasePath}}", + "includeSubfolders": True + }, + "execResultLabel": "sharepoint_structure" + }, + { + "execMethod": "ai", + "execAction": "process", + "execParameters": { + "aiPrompt": "{{KEY:summaryPrompt}}", + "documentList": ["sharepoint_sites_found", "sharepoint_structure"], + "resultType": "docx" + }, + "execResultLabel": "sharepoint_summary" + }, + { + "execMethod": "sharepoint", + "execAction": "uploadDocument", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "documentList": ["sharepoint_summary"], + "pathQuery": "{{KEY:sharepointFolderNameDestination}}" + }, + "execResultLabel": "sharepoint_upload_result" + } + ] + } + ] + }, + "parameters": { + "connectionName": "connection:msft:p.motsch@valueon.ch", + "sharepointBasePath": "/sites/company-share", + "sharepointFolderNameDestination": "/sites/company-share/Freigegebene Dokumente/15. Persoenliche Ordner/Patrick Motsch/output", + "summaryPrompt": "Erstelle eine umfassende Zusammenfassung aller SharePoint Sites und deren Inhalte. Strukturiere das Dokument nach Sites und fasse für jede Site die wichtigsten Themen, Ordnerstrukturen und Dokumente zusammen. Erstelle ein professionelles Word-Dokument mit Überschriften, Abschnitten und einer klaren Gliederung. Berücksichtige alle gefundenen Sites, deren Ordnerstrukturen und dokumentiere die wichtigsten Inhalte pro Site." + } + }, + { + "template": { + "overview": "Immobilienrecherche Zürich", + "tasks": [ + { + "id": "Task02", + "title": "Immobilienrecherche Zürich", + "description": "Webrecherche nach Immobilien im Kanton Zürich und Speicherung in Excel", + "objective": "Immobilienrecherche im Kanton Zürich zum Verkauf (5-20 Mio. CHF) und speichere Ergebnisse in Excel-Liste auf SharePoint", + "actionList": [ + { + "execMethod": "ai", + "execAction": "webResearch", + "execParameters": { + "prompt": "{{KEY:immobilienResearchPrompt}}", + "urlList": ["{{KEY:immobilienResearchUrl}}"] + }, + "execResultLabel": "immobilien_research_results" + }, + { + "execMethod": "ai", + "execAction": "process", + "execParameters": { + "aiPrompt": "{{KEY:excelFormatPrompt}}", + "documentList": ["immobilien_research_results"], + "resultType": "xlsx" + }, + "execResultLabel": "immobilien_excel_list" + }, + { + "execMethod": "sharepoint", + "execAction": "uploadDocument", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "documentList": ["immobilien_excel_list"], + "pathQuery": "{{KEY:sharepointFolderNameDestination}}" + }, + "execResultLabel": "immobilien_upload_result" + } + ] + } + ] + }, + "parameters": { + "connectionName": "connection:msft:p.motsch@valueon.ch", + "sharepointFolderNameDestination": "/sites/company-share/Freigegebene Dokumente/15. Persoenliche Ordner/Patrick Motsch/output", + "immobilienResearchUrl": ["https://www.homegate.ch", "https://www.immoscout24.ch", "https://www.immowelt.ch"], + "immobilienResearchPrompt": "Suche nach Immobilien zum Verkauf im Kanton Zürich, Schweiz, im Preisbereich von 5-20 Millionen CHF. Sammle Informationen zu: Ort, Preis, Beschreibung, URL zu Bildern, Verkäufer/Kontaktinformationen.", + "excelFormatPrompt": "Erstelle eine Excel-Datei mit den recherchierten Immobilien. Jede Immobilie soll eine Zeile sein mit den folgenden Spalten: Ort, Preis (in CHF), Beschreibung, URL zu Bild, Verkäufer. Verwende die Daten aus der Webrecherche." + } + }, + { + "template": { + "overview": "Spesenbelege Zusammenfassung", + "tasks": [ + { + "id": "Task03", + "title": "Spesenbelege CSV Zusammenfassung", + "description": "Liest PDF-Spesenbelege aus SharePoint-Ordner und erstellt CSV-Zusammenfassung", + "objective": "Extrahiere alle PDF-Spesenbelege aus einem SharePoint-Ordner und erstelle eine CSV-Datei mit allen Spesendaten im selben Ordner", + "actionList": [ + { + "execMethod": "sharepoint", + "execAction": "findDocumentPath", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "searchQuery": "{{KEY:sharepointFolderNameSource}}:files:.pdf", + "maxResults": 100 + }, + "execResultLabel": "sharepoint_pdf_files" + }, + { + "execMethod": "sharepoint", + "execAction": "readDocuments", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "pathObject": "sharepoint_pdf_files" + }, + "execResultLabel": "spesenbelege_documents" + }, + { + "execMethod": "ai", + "execAction": "process", + "execParameters": { + "aiPrompt": "{{KEY:expenseExtractionPrompt}}", + "documentList": ["spesenbelege_documents"], + "resultType": "csv" + }, + "execResultLabel": "spesenbelege_csv" + }, + { + "execMethod": "sharepoint", + "execAction": "uploadDocument", + "execParameters": { + "connectionReference": "{{KEY:connectionName}}", + "documentList": ["spesenbelege_csv"], + "pathQuery": "{{KEY:sharepointFolderNameDestination}}" + }, + "execResultLabel": "spesenbelege_upload_result" + } + ] + } + ] + }, + "parameters": { + "connectionName": "connection:msft:p.motsch@valueon.ch", + "sharepointFolderNameSource": "/sites/company-share/Freigegebene Dokumente/15. Persoenliche Ordner/Patrick Motsch/expenses", + "sharepointFolderNameDestination": "/sites/company-share/Freigegebene Dokumente/15. Persoenliche Ordner/Patrick Motsch/output", + "expenseExtractionPrompt": "Verarbeite alle bereitgestellten Dokumente, aber extrahiere nur Daten aus PDF-Spesenbelegen (ignoriere andere Dateitypen). Für jeden gefundenen PDF-Spesenbeleg extrahiere als separaten Datensatz: Datum, Betrag, MWST %, Währung, Kategorie, Beschreibung, Rechnungsnummer, Händler/Verkäufer, Steuerbetrag. Erstelle eine CSV-Datei mit einer Zeile pro Spesenbeleg. Verwende die folgenden Spaltenüberschriften: Datum, Betrag, Währung, Kategorie, Beschreibung, Rechnungsnummer, Händler, Steuerbetrag. Stelle sicher, dass alle Beträge numerisch sind und Datumswerte im Format YYYY-MM-DD vorliegen. Wenn ein Dokument kein Spesenbeleg ist, ignoriere es." + } + }, + { + "template": { + "overview": "Preprocessing Server Data Update", + "tasks": [ + { + "id": "Task04", + "title": "Trigger Preprocessing Server", + "description": "Triggers the preprocessing server at customer tenant to update database with configuration", + "objective": "Call preprocessing server endpoint to update database with provided configuration JSON", + "actionList": [ + { + "execMethod": "context", + "execAction": "triggerPreprocessingServer", + "execParameters": { + "endpoint": "{{KEY:endpoint}}", + "configJson": "{{KEY:configJson}}", + "authSecretConfigKey": "{{KEY:authSecretConfigKey}}" + }, + "execResultLabel": "preprocessing_server_result" + } + ] + } + ] + }, + "parameters": { + "endpoint": "https://poweron-althaus-preprocess-prod-e3fegaatc7faency.switzerlandnorth-01.azurewebsites.net/api/v1/dataprocessor/update-db-with-config", + "authSecretConfigKey": "PREPROCESS_ALTHAUS_CHAT_SECRET", + "configJson": "{\"tables\":[{\"name\":\"Artikel\",\"powerbi_table_name\":\"Artikel\",\"steps\":[{\"keep\":{\"columns\":[\"I_ID\",\"Artikelbeschrieb\",\"Artikelbezeichnung\",\"Artikelgruppe\",\"Artikelkategorie\",\"Artikelkürzel\",\"Artikelnummer\",\"Einheit\",\"Gesperrt\",\"Keywords\",\"Lieferant\",\"Warengruppe\"]}},{\"fillna\":{\"column\":\"Lieferant\",\"value\":\"Unbekannt\"}}]},{\"name\":\"Einkaufspreis\",\"powerbi_table_name\":\"Einkaufspreis\",\"steps\":[{\"to_numeric\":{\"column\":\"EP_CHF\",\"errors\":\"coerce\"}},{\"dropna\":{\"subset\":[\"EP_CHF\"]}}]}]}" + } + }, + { + "template": { + "overview": "JIRA to SharePoint Ticket Synchronization", + "tasks": [ + { + "id": "Task01", + "title": "Sync JIRA Tickets to SharePoint", + "description": "Export JIRA tickets, merge with SharePoint file, upload back, and import changes to JIRA", + "objective": "Synchronize JIRA tickets with SharePoint file (bidirectional sync)", + "actionList": [ + { + "execMethod": "sharepoint", + "execAction": "findSiteByUrl", + "execParameters": { + "connectionReference": "{{KEY:sharepointConnection}}", + "hostname": "{{KEY:sharepointHostname}}", + "sitePath": "{{KEY:sharepointSitePath}}" + }, + "execResultLabel": "sharepoint_site" + }, + { + "execMethod": "jira", + "execAction": "connectJira", + "execParameters": { + "apiUsername": "{{KEY:jiraUsername}}", + "apiTokenConfigKey": "{{KEY:jiraTokenConfigKey}}", + "apiUrl": "{{KEY:jiraUrl}}", + "projectCode": "{{KEY:jiraProjectCode}}", + "issueType": "{{KEY:jiraIssueType}}", + "taskSyncDefinition": "{{KEY:taskSyncDefinition}}" + }, + "execResultLabel": "jira_connection" + }, + { + "execMethod": "jira", + "execAction": "exportTicketsAsJson", + "execParameters": { + "connectionId": "jira_connection", + "taskSyncDefinition": "{{KEY:taskSyncDefinition}}" + }, + "execResultLabel": "jira_exported_tickets" + }, + { + "execMethod": "sharepoint", + "execAction": "downloadFileByPath", + "execParameters": { + "connectionReference": "{{KEY:sharepointConnection}}", + "siteId": "sharepoint_site", + "filePath": "{{KEY:sharepointMainFolder}}/{{KEY:syncFileName}}" + }, + "execResultLabel": "existing_file_content" + }, + { + "execMethod": "jira", + "execAction": "parseExcelContent", + "execParameters": { + "excelContent": "existing_file_content", + "skipRows": 3, + "hasCustomHeaders": True + }, + "execResultLabel": "existing_parsed_data" + }, + { + "execMethod": "jira", + "execAction": "mergeTicketData", + "execParameters": { + "jiraData": "jira_exported_tickets", + "existingData": "existing_parsed_data", + "taskSyncDefinition": "{{KEY:taskSyncDefinition}}", + "idField": "ID" + }, + "execResultLabel": "merged_ticket_data" + }, + { + "execMethod": "sharepoint", + "execAction": "copyFile", + "execParameters": { + "connectionReference": "{{KEY:sharepointConnection}}", + "siteId": "sharepoint_site", + "sourceFolder": "{{KEY:sharepointMainFolder}}", + "sourceFile": "{{KEY:syncFileName}}", + "destFolder": "{{KEY:sharepointBackupFolder}}", + "destFile": "backup_{{TIMESTAMP}}_{{KEY:syncFileName}}" + }, + "execResultLabel": "file_backup" + }, + { + "execMethod": "jira", + "execAction": "createExcelContent", + "execParameters": { + "data": "merged_ticket_data", + "headers": "existing_parsed_data", + "taskSyncDefinition": "{{KEY:taskSyncDefinition}}" + }, + "execResultLabel": "new_file_content" + }, + { + "execMethod": "sharepoint", + "execAction": "uploadFile", + "execParameters": { + "connectionReference": "{{KEY:sharepointConnection}}", + "siteId": "sharepoint_site", + "folderPath": "{{KEY:sharepointMainFolder}}", + "fileName": "{{KEY:syncFileName}}", + "content": "new_file_content" + }, + "execResultLabel": "uploaded_file" + }, + { + "execMethod": "sharepoint", + "execAction": "downloadFileByPath", + "execParameters": { + "connectionReference": "{{KEY:sharepointConnection}}", + "siteId": "sharepoint_site", + "filePath": "{{KEY:sharepointMainFolder}}/{{KEY:syncFileName}}" + }, + "execResultLabel": "uploaded_file_content" + }, + { + "execMethod": "jira", + "execAction": "parseExcelContent", + "execParameters": { + "excelContent": "uploaded_file_content", + "skipRows": 3, + "hasCustomHeaders": True + }, + "execResultLabel": "import_data" + }, + { + "execMethod": "jira", + "execAction": "importTicketsFromJson", + "execParameters": { + "connectionId": "jira_connection", + "ticketData": "import_data", + "taskSyncDefinition": "{{KEY:taskSyncDefinition}}" + }, + "execResultLabel": "import_result" + } + ] + } + ] + }, + "parameters": { + "sharepointConnection": "connection:msft:patrick.motsch@delta.ch", + "sharepointHostname": "deltasecurityag.sharepoint.com", + "sharepointSitePath": "SteeringBPM", + "sharepointMainFolder": "/General/50 Docs hosted by SELISE", + "sharepointBackupFolder": "/General/50 Docs hosted by SELISE/SyncHistory", + "syncFileName": "DELTAgroup x SELISE Ticket Exchange List.xlsx", + "jiraUsername": "p.motsch@valueon.ch", + "jiraTokenConfigKey": "Feature_SyncDelta_JIRA_DELTA_TOKEN_SECRET", + "jiraUrl": "https://deltasecurity.atlassian.net", + "jiraProjectCode": "DCS", + "jiraIssueType": "Task", + "taskSyncDefinition": "{\"ID\":[\"get\",[\"key\"]],\"Module Category\":[\"get\",[\"fields\",\"customfield_10058\",\"value\"]],\"Summary\":[\"get\",[\"fields\",\"summary\"]],\"Description\":[\"get\",[\"fields\",\"description\"]],\"References\":[\"get\",[\"fields\",\"customfield_10066\"]],\"Priority\":[\"get\",[\"fields\",\"priority\",\"name\"]],\"Issue Status\":[\"get\",[\"fields\",\"status\",\"name\"]],\"Assignee\":[\"get\",[\"fields\",\"assignee\",\"displayName\"]],\"Issue Created\":[\"get\",[\"fields\",\"created\"]],\"Due Date\":[\"get\",[\"fields\",\"duedate\"]],\"DELTA Comments\":[\"get\",[\"fields\",\"customfield_10167\"]],\"SELISE Ticket References\":[\"put\",[\"fields\",\"customfield_10067\"]],\"SELISE Status Values\":[\"put\",[\"fields\",\"customfield_10065\"]],\"SELISE Comments\":[\"put\",[\"fields\",\"customfield_10168\"]]}" + } + } + ] +} + + +def getAutomationTemplates() -> Dict[str, Any]: + """ + Get automation templates. + + Returns: + Dict containing the automation templates structure with 'sets' key. + """ + return AUTOMATION_TEMPLATES + diff --git a/modules/workflows/automation/subAutomationUtils.py b/modules/workflows/automation/subAutomationUtils.py new file mode 100644 index 00000000..97d28719 --- /dev/null +++ b/modules/workflows/automation/subAutomationUtils.py @@ -0,0 +1,118 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Utility functions for automation feature. + +Moved from interfaces/interfaceDbChat.py. +""" + +import json +from typing import Dict, Any +from datetime import datetime, UTC + + +def parseScheduleToCron(schedule: str) -> Dict[str, Any]: + """Parse schedule string to cron kwargs for APScheduler""" + parts = schedule.split() + if len(parts) != 5: + raise ValueError(f"Invalid schedule format: {schedule}") + + return { + "minute": parts[0], + "hour": parts[1], + "day": parts[2], + "month": parts[3], + "day_of_week": parts[4] + } + + +def planToPrompt(plan: Dict) -> str: + """Convert plan structure to prompt string for workflow execution""" + return plan.get("userMessage", plan.get("overview", "Execute automation workflow")) + + +def replacePlaceholders(template: str, placeholders: Dict[str, str]) -> str: + """Replace placeholders in template with actual values. Placeholder format: {{KEY:PLACEHOLDER_NAME}} or {{TIMESTAMP}}""" + result = template + + # Replace TIMESTAMP placeholder first (calculated placeholder, not from parameters) + timestampPattern = "{{TIMESTAMP}}" + if timestampPattern in result: + timestamp = datetime.now(UTC).strftime("%Y%m%d_%H%M%S") + result = result.replace(timestampPattern, timestamp) + + for placeholderName, value in placeholders.items(): + pattern = f"{{{{KEY:{placeholderName}}}}}" + + # Check if placeholder is in an array context like ["{{KEY:...}}"] + # If value is a JSON array/dict, we should replace the entire ["{{KEY:...}}"] with the array + arrayPattern = f'["{pattern}"]' + if arrayPattern in result: + # Check if value is a JSON array/dict + isArrayValue = False + arrayValue = None + + if isinstance(value, (list, dict)): + isArrayValue = True + arrayValue = json.dumps(value) + elif isinstance(value, str): + try: + parsed = json.loads(value) + if isinstance(parsed, (list, dict)): + isArrayValue = True + arrayValue = value # Already valid JSON string + except (json.JSONDecodeError, ValueError): + pass + + if isArrayValue: + # Replace ["{{KEY:...}}"] with the array value + result = result.replace(arrayPattern, arrayValue) + continue # Skip the regular replacement below + + # Regular replacement - check if in quoted context + patternStart = result.find(pattern) + isQuoted = False + if patternStart > 0: + charBefore = result[patternStart - 1] if patternStart > 0 else None + patternEnd = patternStart + len(pattern) + charAfter = result[patternEnd] if patternEnd < len(result) else None + if charBefore == '"' and charAfter == '"': + isQuoted = True + + # Handle different value types + if isinstance(value, (list, dict)): + # Python list/dict - convert to JSON + replacement = json.dumps(value) + elif isinstance(value, str): + # String value - check if it's a JSON string representing list/dict + try: + parsed = json.loads(value) + if isinstance(parsed, (list, dict)): + # It's a JSON string of a list/dict + if isQuoted: + # In quoted context, escape the JSON string + escaped = json.dumps(value) + replacement = escaped[1:-1] # Remove outer quotes + else: + # In unquoted context, use JSON directly + replacement = value + else: + # It's a JSON string of a primitive + if isQuoted: + escaped = json.dumps(value) + replacement = escaped[1:-1] + else: + replacement = value + except (json.JSONDecodeError, ValueError): + # Not valid JSON - treat as plain string + if isQuoted: + escaped = json.dumps(value) + replacement = escaped[1:-1] + else: + replacement = value + else: + # Numbers, booleans, None - convert to string + replacement = str(value) + result = result.replace(pattern, replacement) + return result + diff --git a/modules/workflows/methods/methodAi/actions/convertDocument.py b/modules/workflows/methods/methodAi/actions/convertDocument.py index 39d6e16f..03f014d5 100644 --- a/modules/workflows/methods/methodAi/actions/convertDocument.py +++ b/modules/workflows/methods/methodAi/actions/convertDocument.py @@ -3,7 +3,7 @@ import logging from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult +from modules.features.aichat.datamodelFeatureAiChat import ActionResult logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodAi/actions/generateCode.py b/modules/workflows/methods/methodAi/actions/generateCode.py index 4f9bbd21..fecba4e9 100644 --- a/modules/workflows/methods/methodAi/actions/generateCode.py +++ b/modules/workflows/methods/methodAi/actions/generateCode.py @@ -4,7 +4,7 @@ import logging import time from typing import Dict, Any, Optional, List -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.datamodels.datamodelExtraction import ContentPart from modules.datamodels.datamodelAi import AiCallOptions, OperationTypeEnum, PriorityEnum, ProcessingModeEnum from modules.datamodels.datamodelWorkflow import AiResponse, DocumentData diff --git a/modules/workflows/methods/methodAi/actions/generateDocument.py b/modules/workflows/methods/methodAi/actions/generateDocument.py index 65e95a32..dc3231df 100644 --- a/modules/workflows/methods/methodAi/actions/generateDocument.py +++ b/modules/workflows/methods/methodAi/actions/generateDocument.py @@ -4,7 +4,7 @@ import logging import time from typing import Dict, Any, Optional, List -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.datamodels.datamodelExtraction import ContentPart from modules.datamodels.datamodelAi import AiCallOptions, OperationTypeEnum, PriorityEnum, ProcessingModeEnum from modules.datamodels.datamodelWorkflow import AiResponse, DocumentData diff --git a/modules/workflows/methods/methodAi/actions/process.py b/modules/workflows/methods/methodAi/actions/process.py index f804c0b9..06a4817f 100644 --- a/modules/workflows/methods/methodAi/actions/process.py +++ b/modules/workflows/methods/methodAi/actions/process.py @@ -5,7 +5,7 @@ import logging import time import json from typing import Dict, Any, List, Optional -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.datamodels.datamodelAi import AiCallOptions from modules.datamodels.datamodelExtraction import ContentPart diff --git a/modules/workflows/methods/methodAi/actions/summarizeDocument.py b/modules/workflows/methods/methodAi/actions/summarizeDocument.py index e32c1965..8dd37872 100644 --- a/modules/workflows/methods/methodAi/actions/summarizeDocument.py +++ b/modules/workflows/methods/methodAi/actions/summarizeDocument.py @@ -3,7 +3,7 @@ import logging from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult +from modules.features.aichat.datamodelFeatureAiChat import ActionResult logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodAi/actions/translateDocument.py b/modules/workflows/methods/methodAi/actions/translateDocument.py index bb6f8437..0e04dde8 100644 --- a/modules/workflows/methods/methodAi/actions/translateDocument.py +++ b/modules/workflows/methods/methodAi/actions/translateDocument.py @@ -3,7 +3,7 @@ import logging from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult +from modules.features.aichat.datamodelFeatureAiChat import ActionResult logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodAi/actions/webResearch.py b/modules/workflows/methods/methodAi/actions/webResearch.py index 62b43bce..8b462e62 100644 --- a/modules/workflows/methods/methodAi/actions/webResearch.py +++ b/modules/workflows/methods/methodAi/actions/webResearch.py @@ -5,7 +5,7 @@ import logging import time import re from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodChatbot/actions/queryDatabase.py b/modules/workflows/methods/methodChatbot/actions/queryDatabase.py index ff7e896f..b0cc5a0e 100644 --- a/modules/workflows/methods/methodChatbot/actions/queryDatabase.py +++ b/modules/workflows/methods/methodChatbot/actions/queryDatabase.py @@ -11,7 +11,7 @@ import json import time from typing import Dict, Any from modules.workflows.methods.methodBase import action -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.connectors.connectorPreprocessor import PreprocessorConnector logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodContext/actions/extractContent.py b/modules/workflows/methods/methodContext/actions/extractContent.py index 5b90ce13..dabd2f06 100644 --- a/modules/workflows/methods/methodContext/actions/extractContent.py +++ b/modules/workflows/methods/methodContext/actions/extractContent.py @@ -4,7 +4,7 @@ import logging import time from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.datamodels.datamodelDocref import DocumentReferenceList from modules.datamodels.datamodelExtraction import ExtractionOptions, MergeStrategy, ContentExtracted, ContentPart diff --git a/modules/workflows/methods/methodContext/actions/getDocumentIndex.py b/modules/workflows/methods/methodContext/actions/getDocumentIndex.py index 9991285b..c46c9924 100644 --- a/modules/workflows/methods/methodContext/actions/getDocumentIndex.py +++ b/modules/workflows/methods/methodContext/actions/getDocumentIndex.py @@ -4,7 +4,7 @@ import logging import json from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodContext/actions/neutralizeData.py b/modules/workflows/methods/methodContext/actions/neutralizeData.py index 8e3b7185..082497b9 100644 --- a/modules/workflows/methods/methodContext/actions/neutralizeData.py +++ b/modules/workflows/methods/methodContext/actions/neutralizeData.py @@ -4,7 +4,7 @@ import logging import time from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.datamodels.datamodelDocref import DocumentReferenceList from modules.datamodels.datamodelExtraction import ContentExtracted, ContentPart diff --git a/modules/workflows/methods/methodContext/actions/triggerPreprocessingServer.py b/modules/workflows/methods/methodContext/actions/triggerPreprocessingServer.py index 2f011a25..c7c94e6c 100644 --- a/modules/workflows/methods/methodContext/actions/triggerPreprocessingServer.py +++ b/modules/workflows/methods/methodContext/actions/triggerPreprocessingServer.py @@ -5,7 +5,7 @@ import logging import json import aiohttp from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.shared.configuration import APP_CONFIG logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/connectJira.py b/modules/workflows/methods/methodJira/actions/connectJira.py index 45b60cad..c6e2b69a 100644 --- a/modules/workflows/methods/methodJira/actions/connectJira.py +++ b/modules/workflows/methods/methodJira/actions/connectJira.py @@ -5,7 +5,7 @@ import logging import json import uuid from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument from modules.shared.configuration import APP_CONFIG logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/createCsvContent.py b/modules/workflows/methods/methodJira/actions/createCsvContent.py index cbec7960..a33278f3 100644 --- a/modules/workflows/methods/methodJira/actions/createCsvContent.py +++ b/modules/workflows/methods/methodJira/actions/createCsvContent.py @@ -9,7 +9,7 @@ import csv as csv_module from io import StringIO from datetime import datetime, UTC from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/createExcelContent.py b/modules/workflows/methods/methodJira/actions/createExcelContent.py index 631795b3..a4491efb 100644 --- a/modules/workflows/methods/methodJira/actions/createExcelContent.py +++ b/modules/workflows/methods/methodJira/actions/createExcelContent.py @@ -9,7 +9,7 @@ import csv as csv_module from io import BytesIO from datetime import datetime, UTC from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/exportTicketsAsJson.py b/modules/workflows/methods/methodJira/actions/exportTicketsAsJson.py index 55d99654..57179415 100644 --- a/modules/workflows/methods/methodJira/actions/exportTicketsAsJson.py +++ b/modules/workflows/methods/methodJira/actions/exportTicketsAsJson.py @@ -4,7 +4,7 @@ import logging import json from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/importTicketsFromJson.py b/modules/workflows/methods/methodJira/actions/importTicketsFromJson.py index b997889e..60645a06 100644 --- a/modules/workflows/methods/methodJira/actions/importTicketsFromJson.py +++ b/modules/workflows/methods/methodJira/actions/importTicketsFromJson.py @@ -4,7 +4,7 @@ import logging import json from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/mergeTicketData.py b/modules/workflows/methods/methodJira/actions/mergeTicketData.py index 2bd7ab74..899c49d3 100644 --- a/modules/workflows/methods/methodJira/actions/mergeTicketData.py +++ b/modules/workflows/methods/methodJira/actions/mergeTicketData.py @@ -4,7 +4,7 @@ import logging import json from typing import Dict, Any, List -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/parseCsvContent.py b/modules/workflows/methods/methodJira/actions/parseCsvContent.py index bbdc2cc7..455592eb 100644 --- a/modules/workflows/methods/methodJira/actions/parseCsvContent.py +++ b/modules/workflows/methods/methodJira/actions/parseCsvContent.py @@ -6,7 +6,7 @@ import json import io import pandas as pd from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodJira/actions/parseExcelContent.py b/modules/workflows/methods/methodJira/actions/parseExcelContent.py index 5ac4e548..b7cf9214 100644 --- a/modules/workflows/methods/methodJira/actions/parseExcelContent.py +++ b/modules/workflows/methods/methodJira/actions/parseExcelContent.py @@ -6,7 +6,7 @@ import json import pandas as pd from io import BytesIO from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodOutlook/actions/composeAndDraftEmailWithContext.py b/modules/workflows/methods/methodOutlook/actions/composeAndDraftEmailWithContext.py index 59604896..3d8ec9d6 100644 --- a/modules/workflows/methods/methodOutlook/actions/composeAndDraftEmailWithContext.py +++ b/modules/workflows/methods/methodOutlook/actions/composeAndDraftEmailWithContext.py @@ -6,7 +6,7 @@ import json import base64 import requests from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodOutlook/actions/readEmails.py b/modules/workflows/methods/methodOutlook/actions/readEmails.py index 2d325d9f..1fe4992a 100644 --- a/modules/workflows/methods/methodOutlook/actions/readEmails.py +++ b/modules/workflows/methods/methodOutlook/actions/readEmails.py @@ -6,7 +6,7 @@ import time import json import requests from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodOutlook/actions/searchEmails.py b/modules/workflows/methods/methodOutlook/actions/searchEmails.py index f8831d59..0d7c1b6b 100644 --- a/modules/workflows/methods/methodOutlook/actions/searchEmails.py +++ b/modules/workflows/methods/methodOutlook/actions/searchEmails.py @@ -5,7 +5,7 @@ import logging import json import requests from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodOutlook/actions/sendDraftEmail.py b/modules/workflows/methods/methodOutlook/actions/sendDraftEmail.py index 9b7fb011..9f08ddae 100644 --- a/modules/workflows/methods/methodOutlook/actions/sendDraftEmail.py +++ b/modules/workflows/methods/methodOutlook/actions/sendDraftEmail.py @@ -6,7 +6,7 @@ import time import json import requests from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/analyzeFolderUsage.py b/modules/workflows/methods/methodSharepoint/actions/analyzeFolderUsage.py index a4bf18b6..97d42867 100644 --- a/modules/workflows/methods/methodSharepoint/actions/analyzeFolderUsage.py +++ b/modules/workflows/methods/methodSharepoint/actions/analyzeFolderUsage.py @@ -6,7 +6,7 @@ import time import json from datetime import datetime, timezone, timedelta from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/copyFile.py b/modules/workflows/methods/methodSharepoint/actions/copyFile.py index f149e482..7855627d 100644 --- a/modules/workflows/methods/methodSharepoint/actions/copyFile.py +++ b/modules/workflows/methods/methodSharepoint/actions/copyFile.py @@ -4,7 +4,7 @@ import logging import json from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/downloadFileByPath.py b/modules/workflows/methods/methodSharepoint/actions/downloadFileByPath.py index c64a6637..34aa41e7 100644 --- a/modules/workflows/methods/methodSharepoint/actions/downloadFileByPath.py +++ b/modules/workflows/methods/methodSharepoint/actions/downloadFileByPath.py @@ -6,7 +6,7 @@ import json import base64 import os from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/findDocumentPath.py b/modules/workflows/methods/methodSharepoint/actions/findDocumentPath.py index 722dbc99..88c07269 100644 --- a/modules/workflows/methods/methodSharepoint/actions/findDocumentPath.py +++ b/modules/workflows/methods/methodSharepoint/actions/findDocumentPath.py @@ -6,7 +6,7 @@ import time import json import urllib.parse from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/findSiteByUrl.py b/modules/workflows/methods/methodSharepoint/actions/findSiteByUrl.py index 62b6dd94..58d0a2e0 100644 --- a/modules/workflows/methods/methodSharepoint/actions/findSiteByUrl.py +++ b/modules/workflows/methods/methodSharepoint/actions/findSiteByUrl.py @@ -4,7 +4,7 @@ import logging import json from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/listDocuments.py b/modules/workflows/methods/methodSharepoint/actions/listDocuments.py index 318271c3..2c6bde6b 100644 --- a/modules/workflows/methods/methodSharepoint/actions/listDocuments.py +++ b/modules/workflows/methods/methodSharepoint/actions/listDocuments.py @@ -6,7 +6,7 @@ import time import json import urllib.parse from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/readDocuments.py b/modules/workflows/methods/methodSharepoint/actions/readDocuments.py index 73cdb730..7059f1d0 100644 --- a/modules/workflows/methods/methodSharepoint/actions/readDocuments.py +++ b/modules/workflows/methods/methodSharepoint/actions/readDocuments.py @@ -6,7 +6,7 @@ import time import json import base64 from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/uploadDocument.py b/modules/workflows/methods/methodSharepoint/actions/uploadDocument.py index e9361853..bdabdcbb 100644 --- a/modules/workflows/methods/methodSharepoint/actions/uploadDocument.py +++ b/modules/workflows/methods/methodSharepoint/actions/uploadDocument.py @@ -6,7 +6,7 @@ import time import json import urllib.parse from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/methods/methodSharepoint/actions/uploadFile.py b/modules/workflows/methods/methodSharepoint/actions/uploadFile.py index 1f469b80..362c7ba7 100644 --- a/modules/workflows/methods/methodSharepoint/actions/uploadFile.py +++ b/modules/workflows/methods/methodSharepoint/actions/uploadFile.py @@ -5,7 +5,7 @@ import logging import json import base64 from typing import Dict, Any -from modules.datamodels.datamodelChat import ActionResult, ActionDocument +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionDocument logger = logging.getLogger(__name__) diff --git a/modules/workflows/processing/core/actionExecutor.py b/modules/workflows/processing/core/actionExecutor.py index 0e4d6ee4..b621dbff 100644 --- a/modules/workflows/processing/core/actionExecutor.py +++ b/modules/workflows/processing/core/actionExecutor.py @@ -5,8 +5,8 @@ import logging from typing import Dict, Any, List -from modules.datamodels.datamodelChat import ActionResult, ActionItem, TaskStep -from modules.datamodels.datamodelChat import ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import ActionResult, ActionItem, TaskStep +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow from modules.workflows.processing.shared.methodDiscovery import methods from modules.workflows.processing.shared.stateTools import checkWorkflowStopped diff --git a/modules/workflows/processing/core/messageCreator.py b/modules/workflows/processing/core/messageCreator.py index a4ae05e9..84e0c24f 100644 --- a/modules/workflows/processing/core/messageCreator.py +++ b/modules/workflows/processing/core/messageCreator.py @@ -5,8 +5,8 @@ import logging from typing import Dict, Any, Optional, List -from modules.datamodels.datamodelChat import TaskPlan, TaskStep, ActionResult, ReviewResult -from modules.datamodels.datamodelChat import ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import TaskPlan, TaskStep, ActionResult, ReviewResult +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow from modules.workflows.processing.shared.stateTools import checkWorkflowStopped logger = logging.getLogger(__name__) diff --git a/modules/workflows/processing/core/taskPlanner.py b/modules/workflows/processing/core/taskPlanner.py index 0fac427c..af2726b7 100644 --- a/modules/workflows/processing/core/taskPlanner.py +++ b/modules/workflows/processing/core/taskPlanner.py @@ -6,7 +6,7 @@ import json import logging from typing import Dict, Any -from modules.datamodels.datamodelChat import TaskStep, TaskContext, TaskPlan +from modules.features.aichat.datamodelFeatureAiChat import TaskStep, TaskContext, TaskPlan from modules.datamodels.datamodelAi import AiCallOptions, OperationTypeEnum, ProcessingModeEnum, PriorityEnum from modules.workflows.processing.shared.promptGenerationTaskplan import ( generateTaskPlanningPrompt @@ -51,7 +51,7 @@ class TaskPlanner: # Analyze user intent to obtain cleaned user objective for planning # SKIP intent analysis for AUTOMATION mode - it uses predefined JSON plans - from modules.datamodels.datamodelChat import WorkflowModeEnum + from modules.features.aichat.datamodelFeatureAiChat import WorkflowModeEnum workflowMode = getattr(workflow, 'workflowMode', None) skipIntentionAnalysis = (workflowMode == WorkflowModeEnum.WORKFLOW_AUTOMATION) diff --git a/modules/workflows/processing/modes/modeAutomation.py b/modules/workflows/processing/modes/modeAutomation.py index e3131939..085ff694 100644 --- a/modules/workflows/processing/modes/modeAutomation.py +++ b/modules/workflows/processing/modes/modeAutomation.py @@ -7,11 +7,11 @@ import json import logging import uuid from typing import List, Dict, Any, Optional -from modules.datamodels.datamodelChat import ( +from modules.features.aichat.datamodelFeatureAiChat import ( TaskStep, TaskContext, TaskResult, ActionItem, TaskStatus, TaskPlan, ActionResult ) -from modules.datamodels.datamodelChat import ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow from modules.workflows.processing.modes.modeBase import BaseMode from modules.workflows.processing.shared.stateTools import checkWorkflowStopped from modules.shared.timeUtils import parseTimestamp diff --git a/modules/workflows/processing/modes/modeBase.py b/modules/workflows/processing/modes/modeBase.py index 770c868a..de6016ec 100644 --- a/modules/workflows/processing/modes/modeBase.py +++ b/modules/workflows/processing/modes/modeBase.py @@ -6,8 +6,8 @@ from abc import ABC, abstractmethod import logging from typing import List, Dict, Any -from modules.datamodels.datamodelChat import TaskStep, TaskContext, TaskResult, ActionItem -from modules.datamodels.datamodelChat import ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import TaskStep, TaskContext, TaskResult, ActionItem +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow from modules.workflows.processing.core.taskPlanner import TaskPlanner from modules.workflows.processing.core.actionExecutor import ActionExecutor from modules.workflows.processing.core.messageCreator import MessageCreator diff --git a/modules/workflows/processing/modes/modeDynamic.py b/modules/workflows/processing/modes/modeDynamic.py index f7754eab..606a6ce3 100644 --- a/modules/workflows/processing/modes/modeDynamic.py +++ b/modules/workflows/processing/modes/modeDynamic.py @@ -9,11 +9,11 @@ import re import time from datetime import datetime, timezone from typing import List, Dict, Any -from modules.datamodels.datamodelChat import ( +from modules.features.aichat.datamodelFeatureAiChat import ( TaskStep, TaskContext, TaskResult, ActionItem, TaskStatus, ActionResult, Observation, ObservationPreview, ReviewResult ) -from modules.datamodels.datamodelChat import ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow from modules.workflows.processing.modes.modeBase import BaseMode from modules.workflows.processing.shared.stateTools import checkWorkflowStopped from modules.shared.timeUtils import parseTimestamp @@ -893,7 +893,7 @@ class DynamicMode(BaseMode): async def _refineDecide(self, context: TaskContext, observation: Observation) -> ReviewResult: """Refine: decide continue or stop, with reason""" # Create proper ReviewContext for extractReviewContent - from modules.datamodels.datamodelChat import ReviewContext + from modules.features.aichat.datamodelFeatureAiChat import ReviewContext # Convert observation to dict for extractReviewContent (temporary compatibility) observationDict = { 'success': observation.success, @@ -1042,7 +1042,7 @@ class DynamicMode(BaseMode): # Parse response using structured parsing with ReviewResult model from modules.shared.jsonUtils import parseJsonWithModel - from modules.datamodels.datamodelChat import ReviewResult + from modules.features.aichat.datamodelFeatureAiChat import ReviewResult if not resp: return ReviewResult( diff --git a/modules/workflows/processing/shared/executionState.py b/modules/workflows/processing/shared/executionState.py index 1cdf0d53..2094d07a 100644 --- a/modules/workflows/processing/shared/executionState.py +++ b/modules/workflows/processing/shared/executionState.py @@ -5,7 +5,7 @@ import logging from typing import List, Optional -from modules.datamodels.datamodelChat import TaskStep, ActionResult, Observation +from modules.features.aichat.datamodelFeatureAiChat import TaskStep, ActionResult, Observation logger = logging.getLogger(__name__) diff --git a/modules/workflows/processing/shared/placeholderFactory.py b/modules/workflows/processing/shared/placeholderFactory.py index 136dd2cb..260ef8b8 100644 --- a/modules/workflows/processing/shared/placeholderFactory.py +++ b/modules/workflows/processing/shared/placeholderFactory.py @@ -348,7 +348,7 @@ def extractReviewContent(context: Any) -> str: elif hasattr(context, 'observation') and context.observation: # For observation data, show full content but handle documents specially # Handle both Pydantic Observation model and dict format - from modules.datamodels.datamodelChat import Observation + from modules.features.aichat.datamodelFeatureAiChat import Observation if isinstance(context.observation, Observation): # Convert Pydantic model to dict @@ -371,7 +371,7 @@ def extractReviewContent(context: Any) -> str: # For observation data in stepResult, show full content but handle documents specially observation = context.stepResult['observation'] # Handle both Pydantic Observation model and dict format - from modules.datamodels.datamodelChat import Observation + from modules.features.aichat.datamodelFeatureAiChat import Observation if isinstance(observation, Observation): # Convert Pydantic model to dict @@ -452,7 +452,7 @@ def extractLatestRefinementFeedback(context: Any) -> str: # First check for ERROR level logs in workflow if hasattr(context, 'workflow') and context.workflow: try: - import modules.interfaces.interfaceDbChat as interfaceDbChat + import modules.features.aichat.interfaceFeatureAiChat as interfaceDbChat from modules.interfaces.interfaceDbApp import getRootInterface rootInterface = getRootInterface() interfaceDbChat = interfaceDbChat.getInterface(rootInterface.currentUser) diff --git a/modules/workflows/processing/shared/promptGenerationActionsDynamic.py b/modules/workflows/processing/shared/promptGenerationActionsDynamic.py index 31878033..92432038 100644 --- a/modules/workflows/processing/shared/promptGenerationActionsDynamic.py +++ b/modules/workflows/processing/shared/promptGenerationActionsDynamic.py @@ -7,7 +7,7 @@ Handles prompt templates for dynamic mode action handling. import json from typing import Any, List -from modules.datamodels.datamodelChat import PromptBundle, PromptPlaceholder +from modules.features.aichat.datamodelFeatureAiChat import PromptBundle, PromptPlaceholder from modules.workflows.processing.shared.placeholderFactory import ( extractUserPrompt, extractUserLanguage, diff --git a/modules/workflows/processing/shared/promptGenerationTaskplan.py b/modules/workflows/processing/shared/promptGenerationTaskplan.py index 11a54ca1..d840cc1e 100644 --- a/modules/workflows/processing/shared/promptGenerationTaskplan.py +++ b/modules/workflows/processing/shared/promptGenerationTaskplan.py @@ -7,7 +7,7 @@ Handles prompt templates and extraction functions for task planning phase. import logging from typing import Dict, Any, List -from modules.datamodels.datamodelChat import PromptBundle, PromptPlaceholder +from modules.features.aichat.datamodelFeatureAiChat import PromptBundle, PromptPlaceholder from modules.workflows.processing.shared.placeholderFactory import ( extractUserPrompt, extractAvailableDocumentsSummary, diff --git a/modules/workflows/processing/workflowProcessor.py b/modules/workflows/processing/workflowProcessor.py index 9c9d6c84..b613d5fd 100644 --- a/modules/workflows/processing/workflowProcessor.py +++ b/modules/workflows/processing/workflowProcessor.py @@ -7,8 +7,8 @@ import logging import json from typing import Dict, Any, Optional, List, TYPE_CHECKING from modules.datamodels import datamodelChat -from modules.datamodels.datamodelChat import TaskStep, TaskContext, TaskPlan, ActionResult, ActionDocument, ChatDocument, ChatMessage -from modules.datamodels.datamodelChat import ChatWorkflow, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import TaskStep, TaskContext, TaskPlan, ActionResult, ActionDocument, ChatDocument, ChatMessage +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, WorkflowModeEnum from modules.workflows.processing.modes.modeBase import BaseMode from modules.workflows.processing.modes.modeDynamic import DynamicMode from modules.workflows.processing.modes.modeAutomation import AutomationMode @@ -494,7 +494,7 @@ class WorkflowProcessor: # Create ActionResult with response # For fast path, we create a simple text document with the response - from modules.datamodels.datamodelChat import ActionDocument + from modules.features.aichat.datamodelFeatureAiChat import ActionDocument responseDoc = ActionDocument( documentName="fast_path_response.txt", @@ -626,7 +626,7 @@ class WorkflowProcessor: ChatMessage with persisted documents """ try: - from modules.datamodels.datamodelChat import ChatMessage, ChatDocument, ActionDocument + from modules.features.aichat.datamodelFeatureAiChat import ChatMessage, ChatDocument, ActionDocument from modules.workflows.processing.shared.stateTools import checkWorkflowStopped # Check workflow status diff --git a/modules/workflows/workflowManager.py b/modules/workflows/workflowManager.py index a9b656eb..a7d28d39 100644 --- a/modules/workflows/workflowManager.py +++ b/modules/workflows/workflowManager.py @@ -6,14 +6,14 @@ import uuid import asyncio import json -from modules.datamodels.datamodelChat import ( +from modules.features.aichat.datamodelFeatureAiChat import ( UserInputRequest, ChatMessage, ChatWorkflow, ChatDocument, WorkflowModeEnum ) -from modules.datamodels.datamodelChat import TaskContext +from modules.features.aichat.datamodelFeatureAiChat import TaskContext from modules.workflows.processing.workflowProcessor import WorkflowProcessor from modules.workflows.processing.shared.stateTools import WorkflowStoppedException, checkWorkflowStopped @@ -606,7 +606,7 @@ The following is the user's original input message. Analyze intent, normalize th # Collect file info fileInfo = self.services.chat.getFileInfo(fileItem.id) - from modules.datamodels.datamodelChat import ChatDocument + from modules.features.aichat.datamodelFeatureAiChat import ChatDocument doc = ChatDocument( fileId=fileItem.id, fileName=fileInfo.get("fileName", fileName) if fileInfo else fileName, @@ -792,7 +792,7 @@ The following is the user's original input message. Analyze intent, normalize th # Collect file info fileInfo = self.services.chat.getFileInfo(fileItem.id) - from modules.datamodels.datamodelChat import ChatDocument + from modules.features.aichat.datamodelFeatureAiChat import ChatDocument doc = ChatDocument( fileId=fileItem.id, fileName=fileInfo.get("fileName", fileName) if fileInfo else fileName, @@ -921,7 +921,7 @@ The following is the user's original input message. Analyze intent, normalize th # Persist task result for cross-task/round document references # Convert ChatTaskResult to WorkflowTaskResult for persistence from modules.datamodels.datamodelWorkflow import TaskResult as WorkflowTaskResult - from modules.datamodels.datamodelChat import ActionResult + from modules.features.aichat.datamodelFeatureAiChat import ActionResult # Get final ActionResult from task execution (last action result) finalActionResult = None diff --git a/scripts/import_analysis.csv b/scripts/import_analysis.csv new file mode 100644 index 00000000..a81312fe --- /dev/null +++ b/scripts/import_analysis.csv @@ -0,0 +1,2716 @@ +module_name,imported_module_name,position,import_valid +gateway.app,contextlib,header,Yes +gateway.app,datetime,header,Yes +gateway.app,fastapi,header,Yes +gateway.app,fastapi.middleware.cors,header,Yes +gateway.app,fastapi.openapi.utils,function customOpenapi,Yes +gateway.app,fastapi.security,header,Yes +gateway.app,logging,header,Yes +gateway.app,logging.handlers,header,Yes +gateway.app,modules.auth,header,Yes +gateway.app,modules.auth,header,Yes +gateway.app,modules.features.featureRegistry,header,Yes +gateway.app,modules.features.featureRegistry,header,Yes +gateway.app,modules.interfaces.interfaceDbApp,header,Yes +gateway.app,modules.routes.routeAdmin,header,Yes +gateway.app,modules.routes.routeAdminAutomationEvents,header,Yes +gateway.app,modules.routes.routeAdminFeatures,header,Yes +gateway.app,modules.routes.routeAdminRbacExport,header,Yes +gateway.app,modules.routes.routeAdminRbacRules,header,Yes +gateway.app,modules.routes.routeAttributes,header,Yes +gateway.app,modules.routes.routeDataConnections,header,Yes +gateway.app,modules.routes.routeDataFiles,header,Yes +gateway.app,modules.routes.routeDataMandates,header,Yes +gateway.app,modules.routes.routeDataPrompts,header,Yes +gateway.app,modules.routes.routeDataUsers,header,Yes +gateway.app,modules.routes.routeDataWorkflows,header,Yes +gateway.app,modules.routes.routeGdpr,header,Yes +gateway.app,modules.routes.routeInvitations,header,Yes +gateway.app,modules.routes.routeMessaging,header,Yes +gateway.app,modules.routes.routeOptions,header,Yes +gateway.app,modules.routes.routeSecurityAdmin,header,Yes +gateway.app,modules.routes.routeSecurityGoogle,header,Yes +gateway.app,modules.routes.routeSecurityLocal,header,Yes +gateway.app,modules.routes.routeSecurityMsft,header,Yes +gateway.app,modules.routes.routeSharepoint,header,Yes +gateway.app,modules.routes.routeVoiceGoogle,header,Yes +gateway.app,modules.shared.auditLogger,function lifespan,Yes +gateway.app,modules.shared.configuration,header,Yes +gateway.app,modules.shared.eventManagement,header,Yes +gateway.app,modules.workflows.automation,header,Yes +gateway.app,os,header,Yes +gateway.app,sys,header,Yes +gateway.app,unicodedata,header,Yes +gateway.app,urllib.parse,header,Yes +gateway.modules.auth.__init__,(relative) .authentication,header,Yes +gateway.modules.auth.__init__,(relative) .csrf,header,Yes +gateway.modules.auth.__init__,(relative) .jwtService,header,Yes +gateway.modules.auth.__init__,(relative) .tokenManager,header,Yes +gateway.modules.auth.__init__,(relative) .tokenRefreshMiddleware,header,Yes +gateway.modules.auth.__init__,(relative) .tokenRefreshService,header,Yes +gateway.modules.auth.authentication,fastapi,header,Yes +gateway.modules.auth.authentication,fastapi.security,header,Yes +gateway.modules.auth.authentication,jose,header,Yes +gateway.modules.auth.authentication,logging,header,Yes +gateway.modules.auth.authentication,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.auth.authentication,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.auth.authentication,modules.datamodels.datamodelUam,header,Yes +gateway.modules.auth.authentication,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.auth.authentication,modules.security.rootAccess,header,Yes +gateway.modules.auth.authentication,modules.shared.auditLogger,function requireSysAdmin,Yes +gateway.modules.auth.authentication,modules.shared.configuration,header,Yes +gateway.modules.auth.authentication,slowapi,header,Yes +gateway.modules.auth.authentication,slowapi.util,header,Yes +gateway.modules.auth.authentication,typing,header,Yes +gateway.modules.auth.csrf,fastapi,header,Yes +gateway.modules.auth.csrf,fastapi.responses,function dispatch,Yes +gateway.modules.auth.csrf,fastapi.responses,function dispatch,Yes +gateway.modules.auth.csrf,logging,header,Yes +gateway.modules.auth.csrf,starlette.middleware.base,header,Yes +gateway.modules.auth.csrf,typing,header,Yes +gateway.modules.auth.jwtService,datetime,header,Yes +gateway.modules.auth.jwtService,fastapi,header,Yes +gateway.modules.auth.jwtService,jose,header,Yes +gateway.modules.auth.jwtService,modules.shared.configuration,header,Yes +gateway.modules.auth.jwtService,modules.shared.timeUtils,header,Yes +gateway.modules.auth.jwtService,typing,header,Yes +gateway.modules.auth.jwtService,uuid,function createAccessToken,Yes +gateway.modules.auth.jwtService,uuid,function createRefreshToken,Yes +gateway.modules.auth.tokenManager,httpx,header,Yes +gateway.modules.auth.tokenManager,logging,header,Yes +gateway.modules.auth.tokenManager,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.auth.tokenManager,modules.datamodels.datamodelUam,header,Yes +gateway.modules.auth.tokenManager,modules.interfaces.interfaceDbApp,function getFreshToken,Yes +gateway.modules.auth.tokenManager,modules.security.rootAccess,function getFreshToken,Yes +gateway.modules.auth.tokenManager,modules.shared.configuration,header,Yes +gateway.modules.auth.tokenManager,modules.shared.timeUtils,header,Yes +gateway.modules.auth.tokenManager,typing,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,asyncio,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,fastapi,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,logging,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,modules.auth.tokenRefreshService,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,modules.shared.timeUtils,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,starlette.middleware.base,header,Yes +gateway.modules.auth.tokenRefreshMiddleware,typing,header,Yes +gateway.modules.auth.tokenRefreshService,logging,header,Yes +gateway.modules.auth.tokenRefreshService,modules.auth.tokenManager,function _refresh_google_token,Yes +gateway.modules.auth.tokenRefreshService,modules.auth.tokenManager,function _refresh_microsoft_token,Yes +gateway.modules.auth.tokenRefreshService,modules.datamodels.datamodelUam,header,Yes +gateway.modules.auth.tokenRefreshService,modules.interfaces.interfaceDbApp,function refresh_expired_tokens,Yes +gateway.modules.auth.tokenRefreshService,modules.interfaces.interfaceDbApp,function proactive_refresh,Yes +gateway.modules.auth.tokenRefreshService,modules.security.rootAccess,function refresh_expired_tokens,Yes +gateway.modules.auth.tokenRefreshService,modules.security.rootAccess,function proactive_refresh,Yes +gateway.modules.auth.tokenRefreshService,modules.shared.auditLogger,header,Yes +gateway.modules.auth.tokenRefreshService,modules.shared.timeUtils,header,Yes +gateway.modules.auth.tokenRefreshService,typing,header,Yes +gateway.modules.connectors.connectorDbPostgre,json,function _save_record,Yes +gateway.modules.connectors.connectorDbPostgre,json,function _loadRecord,Yes +gateway.modules.connectors.connectorDbPostgre,json,function _loadTable,Yes +gateway.modules.connectors.connectorDbPostgre,json,function getRecordset,Yes +gateway.modules.connectors.connectorDbPostgre,logging,header,Yes +gateway.modules.connectors.connectorDbPostgre,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.connectors.connectorDbPostgre,modules.datamodels.datamodelUam,header,Yes +gateway.modules.connectors.connectorDbPostgre,modules.shared.configuration,header,Yes +gateway.modules.connectors.connectorDbPostgre,modules.shared.timeUtils,header,Yes +gateway.modules.connectors.connectorDbPostgre,psycopg2,header,Yes +gateway.modules.connectors.connectorDbPostgre,psycopg2.extras,header,Yes +gateway.modules.connectors.connectorDbPostgre,pydantic,header,Yes +gateway.modules.connectors.connectorDbPostgre,threading,header,Yes +gateway.modules.connectors.connectorDbPostgre,typing,header,Yes +gateway.modules.connectors.connectorDbPostgre,uuid,header,Yes +gateway.modules.connectors.connectorMessagingEmail,azure.communication.email,header,Yes +gateway.modules.connectors.connectorMessagingEmail,logging,header,Yes +gateway.modules.connectors.connectorMessagingEmail,modules.shared.configuration,header,Yes +gateway.modules.connectors.connectorMessagingEmail,typing,header,Yes +gateway.modules.connectors.connectorMessagingSms,logging,header,Yes +gateway.modules.connectors.connectorMessagingSms,modules.shared.configuration,header,Yes +gateway.modules.connectors.connectorMessagingSms,twilio.rest,function __init__,Yes +gateway.modules.connectors.connectorMessagingSms,typing,header,Yes +gateway.modules.connectors.connectorPreprocessor,httpx,header,Yes +gateway.modules.connectors.connectorPreprocessor,logging,header,Yes +gateway.modules.connectors.connectorPreprocessor,modules.shared.configuration,header,Yes +gateway.modules.connectors.connectorPreprocessor,typing,header,Yes +gateway.modules.connectors.connectorSwissTopoMapServer,aiohttp,header,Yes +gateway.modules.connectors.connectorSwissTopoMapServer,asyncio,header,Yes +gateway.modules.connectors.connectorSwissTopoMapServer,logging,header,Yes +gateway.modules.connectors.connectorSwissTopoMapServer,modules.shared.configuration,header,Yes +gateway.modules.connectors.connectorSwissTopoMapServer,re,header,Yes +gateway.modules.connectors.connectorSwissTopoMapServer,typing,header,Yes +gateway.modules.connectors.connectorTicketsClickup,aiohttp,header,Yes +gateway.modules.connectors.connectorTicketsClickup,logging,header,Yes +gateway.modules.connectors.connectorTicketsClickup,modules.datamodels.datamodelTickets,header,Yes +gateway.modules.connectors.connectorTicketsClickup,typing,header,Yes +gateway.modules.connectors.connectorTicketsJira,aiohttp,header,Yes +gateway.modules.connectors.connectorTicketsJira,asyncio,header,Yes +gateway.modules.connectors.connectorTicketsJira,json,header,Yes +gateway.modules.connectors.connectorTicketsJira,logging,header,Yes +gateway.modules.connectors.connectorTicketsJira,modules.datamodels.datamodelTickets,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,google.cloud,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,google.cloud,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,google.cloud,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,google.oauth2,function __init__,Yes +gateway.modules.connectors.connectorVoiceGoogle,html,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,json,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,logging,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,modules.shared.configuration,header,Yes +gateway.modules.connectors.connectorVoiceGoogle,typing,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.__init__,(relative) .,header,Yes +gateway.modules.datamodels.datamodelAi,enum,header,Yes +gateway.modules.datamodels.datamodelAi,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.datamodels.datamodelAi,pydantic,header,Yes +gateway.modules.datamodels.datamodelAi,typing,header,Yes +gateway.modules.datamodels.datamodelAudit,enum,header,Yes +gateway.modules.datamodels.datamodelAudit,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelAudit,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelAudit,pydantic,header,Yes +gateway.modules.datamodels.datamodelAudit,typing,header,Yes +gateway.modules.datamodels.datamodelAudit,uuid,header,Yes +gateway.modules.datamodels.datamodelDocref,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelDocref,pydantic,header,Yes +gateway.modules.datamodels.datamodelDocref,typing,header,Yes +gateway.modules.datamodels.datamodelDocument,datetime,header,Yes +gateway.modules.datamodels.datamodelDocument,pydantic,header,Yes +gateway.modules.datamodels.datamodelDocument,typing,header,Yes +gateway.modules.datamodels.datamodelExtraction,pydantic,header,Yes +gateway.modules.datamodels.datamodelExtraction,typing,header,Yes +gateway.modules.datamodels.datamodelFeatures,modules.datamodels.datamodelUtils,header,Yes +gateway.modules.datamodels.datamodelFeatures,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelFeatures,pydantic,header,Yes +gateway.modules.datamodels.datamodelFeatures,typing,header,Yes +gateway.modules.datamodels.datamodelFeatures,uuid,header,Yes +gateway.modules.datamodels.datamodelFiles,base64,header,Yes +gateway.modules.datamodels.datamodelFiles,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelFiles,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelFiles,pydantic,header,Yes +gateway.modules.datamodels.datamodelFiles,typing,header,Yes +gateway.modules.datamodels.datamodelFiles,uuid,header,Yes +gateway.modules.datamodels.datamodelInvitation,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelInvitation,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelInvitation,pydantic,header,Yes +gateway.modules.datamodels.datamodelInvitation,secrets,header,Yes +gateway.modules.datamodels.datamodelInvitation,typing,header,Yes +gateway.modules.datamodels.datamodelInvitation,uuid,header,Yes +gateway.modules.datamodels.datamodelJson,typing,header,Yes +gateway.modules.datamodels.datamodelMembership,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelMembership,pydantic,header,Yes +gateway.modules.datamodels.datamodelMembership,uuid,header,Yes +gateway.modules.datamodels.datamodelMessaging,enum,header,Yes +gateway.modules.datamodels.datamodelMessaging,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelMessaging,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelMessaging,pydantic,header,Yes +gateway.modules.datamodels.datamodelMessaging,typing,header,Yes +gateway.modules.datamodels.datamodelMessaging,uuid,header,Yes +gateway.modules.datamodels.datamodelPagination,math,header,Yes +gateway.modules.datamodels.datamodelPagination,pydantic,header,Yes +gateway.modules.datamodels.datamodelPagination,typing,header,Yes +gateway.modules.datamodels.datamodelRbac,enum,header,Yes +gateway.modules.datamodels.datamodelRbac,modules.datamodels.datamodelUam,header,Yes +gateway.modules.datamodels.datamodelRbac,modules.datamodels.datamodelUtils,header,Yes +gateway.modules.datamodels.datamodelRbac,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelRbac,pydantic,header,Yes +gateway.modules.datamodels.datamodelRbac,typing,header,Yes +gateway.modules.datamodels.datamodelRbac,uuid,header,Yes +gateway.modules.datamodels.datamodelSecurity,(relative) .datamodelUam,header,Yes +gateway.modules.datamodels.datamodelSecurity,enum,header,Yes +gateway.modules.datamodels.datamodelSecurity,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelSecurity,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelSecurity,pydantic,header,Yes +gateway.modules.datamodels.datamodelSecurity,typing,header,Yes +gateway.modules.datamodels.datamodelSecurity,uuid,header,Yes +gateway.modules.datamodels.datamodelTickets,abc,header,Yes +gateway.modules.datamodels.datamodelTickets,pydantic,header,Yes +gateway.modules.datamodels.datamodelTickets,typing,header,Yes +gateway.modules.datamodels.datamodelUam,enum,header,Yes +gateway.modules.datamodels.datamodelUam,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelUam,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelUam,pydantic,header,Yes +gateway.modules.datamodels.datamodelUam,typing,header,Yes +gateway.modules.datamodels.datamodelUam,uuid,header,Yes +gateway.modules.datamodels.datamodelUtils,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelUtils,pydantic,header,Yes +gateway.modules.datamodels.datamodelUtils,typing,header,Yes +gateway.modules.datamodels.datamodelUtils,uuid,header,Yes +gateway.modules.datamodels.datamodelVoice,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelVoice,modules.shared.timeUtils,header,Yes +gateway.modules.datamodels.datamodelVoice,pydantic,header,Yes +gateway.modules.datamodels.datamodelVoice,uuid,header,Yes +gateway.modules.datamodels.datamodelWorkflow,modules.datamodels.datamodelDocref,header,Yes +gateway.modules.datamodels.datamodelWorkflow,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelWorkflow,modules.shared.jsonUtils,header,Yes +gateway.modules.datamodels.datamodelWorkflow,pydantic,header,Yes +gateway.modules.datamodels.datamodelWorkflow,typing,header,Yes +gateway.modules.datamodels.datamodelWorkflowActions,modules.datamodels.datamodelChat,header,No +gateway.modules.datamodels.datamodelWorkflowActions,modules.shared.attributeUtils,header,Yes +gateway.modules.datamodels.datamodelWorkflowActions,modules.shared.frontendTypes,header,Yes +gateway.modules.datamodels.datamodelWorkflowActions,pydantic,header,Yes +gateway.modules.datamodels.datamodelWorkflowActions,typing,header,Yes +gateway.modules.features.aichat.aicore.aicoreBase,abc,header,Yes +gateway.modules.features.aichat.aicore.aicoreBase,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicoreBase,time,function getCachedModels,Yes +gateway.modules.features.aichat.aicore.aicoreBase,typing,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,(relative) .aicoreBase,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,importlib,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,logging,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,modules.security.rbac,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,modules.security.rbacHelpers,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,os,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,time,function refreshModels,Yes +gateway.modules.features.aichat.aicore.aicoreModelRegistry,typing,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelSelector,logging,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelSelector,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicoreModelSelector,typing,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,(relative) .aicoreBase,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,base64,function callAiImage,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,fastapi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,httpx,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,logging,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,modules.shared.configuration,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,os,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,time,function callAiImage,Yes +gateway.modules.features.aichat.aicore.aicorePluginAnthropic,typing,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginInternal,(relative) .aicoreBase,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginInternal,logging,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginInternal,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginInternal,typing,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,(relative) .aicoreBase,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,fastapi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,httpx,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,json,function generateImage,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,logging,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,modules.datamodels.datamodelAi,function generateImage,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,modules.shared.configuration,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginOpenai,typing,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,(relative) .aicoreBase,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,fastapi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,httpx,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,json,function webSearch,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,json,function webCrawl,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,json,function webCrawl,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,logging,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,modules.datamodels.datamodelAi,function _testConnection,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,modules.datamodels.datamodelTools,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,modules.shared.configuration,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginPerplexity,typing,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,(relative) .aicoreBase,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,asyncio,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,dataclasses,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,json,function webSearch,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,json,function webSearch,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,json,function webCrawl,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,json,function webCrawl,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,json,function webSearch,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,json,function webCrawl,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,logging,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,modules.datamodels.datamodelTools,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,modules.shared.configuration,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,re,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,re,function _cleanUrl,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,tavily,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,typing,header,Yes +gateway.modules.features.aichat.aicore.aicorePluginTavily,urllib.parse,function _normalizeUrl,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,enum,header,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,modules.datamodels.datamodelWorkflow,function updateFromSelection,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,modules.shared.attributeUtils,header,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,modules.shared.timeUtils,header,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,pydantic,header,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,typing,header,Yes +gateway.modules.features.aichat.datamodelFeatureAiChat,uuid,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,(relative) .datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,asyncio,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,datetime,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,json,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,logging,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,math,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.interfaces.interfaceDbApp,function _enrichAutomationsWithUserAndMandate,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.interfaces.interfaceDbManagement,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.security.rbac,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.security.rootAccess,function setUserContext,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.shared.callbackRegistry,function _notifyAutomationChanged,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.shared.configuration,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.shared.debugLogger,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,modules.shared.timeUtils,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,os,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,typing,header,Yes +gateway.modules.features.aichat.interfaceFeatureAiChat,uuid,header,Yes +gateway.modules.features.aichat.mainAiChat,(relative) .aicore.aicoreModelRegistry,function onStart,Yes +gateway.modules.features.aichat.mainAiChat,logging,header,Yes +gateway.modules.features.aichat.mainAiChat,typing,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,(relative) .,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,(relative) .datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,fastapi,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,logging,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,modules.auth,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,modules.workflows.automation,header,Yes +gateway.modules.features.aichat.routeFeatureAiChat,typing,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subAiCallLooping,function _initializeSubmodules,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subContentExtraction,function _initializeSubmodules,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subDocumentIntents,function _initializeSubmodules,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subJsonResponseHandling,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subResponseParsing,function _initializeSubmodules,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subStructureFilling,function _initializeSubmodules,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,(relative) .subStructureGeneration,function _initializeSubmodules,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,base64,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,json,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,logging,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.features.aichat.serviceExtraction.mainServiceExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.features.aichat.serviceGeneration.mainServiceGeneration,function renderResult,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.features.aichat.serviceGeneration.paths.codePath,function _handleCodeGeneration,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.features.aichat.serviceGeneration.paths.documentPath,function _handleDocumentGeneration,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.features.aichat.serviceGeneration.paths.imagePath,function _handleImageGeneration,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.interfaces.interfaceAiObjects,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,re,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,time,header,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,time,function _handleDataExtraction,Yes +gateway.modules.features.aichat.serviceAi.mainServiceAi,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,(relative) .subJsonResponseHandling,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,(relative) .subLoopingUseCases,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,json,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.shared.jsonContinuation,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceAi.subAiCallLooping,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,base64,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,json,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,modules.datamodels.datamodelAi,function extractTextFromImage,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,modules.datamodels.datamodelAi,function processTextContentWithAi,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,modules.datamodels.datamodelExtraction,function extractAndPrepareContent,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,traceback,function extractTextFromImage,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,traceback,function processTextContentWithAi,Yes +gateway.modules.features.aichat.serviceAi.subContentExtraction,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,json,header,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,modules.datamodels.datamodelExtraction,function resolvePreExtractedDocument,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,traceback,function resolvePreExtractedDocument,Yes +gateway.modules.features.aichat.serviceAi.subDocumentIntents,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,datetime,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,json,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,os,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,re,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonMerger,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,(relative) .subJsonMerger,function mergeJsonStringsWithOverlap,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,json,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.debugLogger,function mergeFragmentIntoSection,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function mergeJsonStringsWithOverlap,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _normalizeToElementsStructure,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _extractRowsFromFragment,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _extractOverlapAndContinuation,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _mergeWithExplicitOverlap,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _extractValidJsonPrefix,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _smartConcatenate,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _mergeJsonStringsWithOverlapFallback,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _detectAndNormalizeFragment,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _detectAndNormalizeFragment,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _extractValidJsonPrefix,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function _mergeJsonStructuresGeneric,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,modules.shared.jsonUtils,function extractKpiValuesFromIncompleteJson,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,re,header,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,re,function _extractRowsFromFragment,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,re,function _detectAndNormalizeFragment,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,traceback,function _mergeJsonStructuresGeneric,Yes +gateway.modules.features.aichat.serviceAi.subJsonResponseHandling,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subLoopingUseCases,dataclasses,header,Yes +gateway.modules.features.aichat.serviceAi.subLoopingUseCases,json,function _handleChapterStructureFinalResult,Yes +gateway.modules.features.aichat.serviceAi.subLoopingUseCases,json,function _handleCodeStructureFinalResult,Yes +gateway.modules.features.aichat.serviceAi.subLoopingUseCases,json,function _handleCodeContentFinalResult,Yes +gateway.modules.features.aichat.serviceAi.subLoopingUseCases,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subLoopingUseCases,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subResponseParsing,(relative) .subJsonResponseHandling,header,Yes +gateway.modules.features.aichat.serviceAi.subResponseParsing,json,header,Yes +gateway.modules.features.aichat.serviceAi.subResponseParsing,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subResponseParsing,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.subResponseParsing,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceAi.subResponseParsing,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,asyncio,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,base64,function _processAiResponseForSection,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,copy,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,json,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.datamodels.datamodelJson,function _getAcceptedSectionTypesForFormat,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.datamodels.datamodelJson,function _getAcceptedSectionTypesForFormat,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.features.aichat.serviceGeneration.renderers.registry,function _getAcceptedSectionTypesForFormat,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.shared.jsonContinuation,function buildSectionPromptWithContinuation,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.shared.jsonUtils,function _extractAndMergeMultipleJsonBlocks,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.shared.jsonUtils,function _processAiResponseForSection,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.shared.jsonUtils,function _processSingleSection,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureFilling,typing,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,json,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,logging,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,modules.features.aichat.serviceGeneration.renderers.registry,function generateStructure,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,modules.shared,function generateStructure,No +gateway.modules.features.aichat.serviceAi.subStructureGeneration,modules.shared.jsonContinuation,function generateStructure,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceAi.subStructureGeneration,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.__init__,(relative) .mainServiceExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerImage,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerImage,PIL,function chunk,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerImage,base64,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerImage,io,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerImage,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerImage,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerStructure,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerStructure,json,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerStructure,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerStructure,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerTable,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerTable,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerTable,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerText,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerText,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerText,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.chunking.chunkerText,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorBinary,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorBinary,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorBinary,base64,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorBinary,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorBinary,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorCsv,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorCsv,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorCsv,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorCsv,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorDocx,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorDocx,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorDocx,docx,function _load,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorDocx,io,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorDocx,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorDocx,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorHtml,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorHtml,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorHtml,bs4,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorHtml,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorHtml,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,PIL,function extract,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,base64,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,io,function extract,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorImage,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorJson,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorJson,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorJson,json,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorJson,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorJson,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,PyPDF2,function _load,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,base64,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,fitz,function _load,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,io,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPdf,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,base64,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,io,function extract,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,pptx,function _load,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorPptx,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorSql,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorSql,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorSql,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorSql,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorText,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorText,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorText,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorText,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,datetime,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,io,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,openpyxl,function _load,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXlsx,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXml,(relative) ..subRegistry,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXml,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXml,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXml,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.extractors.extractorXml,xml.etree.ElementTree,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,(relative) .merging.mergerDefault,function applyMerging,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,(relative) .merging.mergerTable,function applyMerging,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,(relative) .merging.mergerText,function applyMerging,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,(relative) .subMerger,function applyMerging,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,(relative) .subPipeline,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,(relative) .subRegistry,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,asyncio,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,base64,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,json,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.datamodels.datamodelAi,function mergePartResults,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.features.aichat.aicore.aicoreModelRegistry,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.features.aichat.aicore.aicoreModelSelector,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.interfaces.interfaceDbManagement,function extractContent,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.shared.debugLogger,function extractContent,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,time,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.mainServiceExtraction,uuid,header,Yes +gateway.modules.features.aichat.serviceExtraction.merging.mergerDefault,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.merging.mergerDefault,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.merging.mergerTable,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.merging.mergerTable,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.merging.mergerTable,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.merging.mergerText,(relative) ..subUtils,header,No +gateway.modules.features.aichat.serviceExtraction.merging.mergerText,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.merging.mergerText,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.subMerger,(relative) .subUtils,header,Yes +gateway.modules.features.aichat.serviceExtraction.subMerger,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.subMerger,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.subMerger,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPipeline,(relative) .mainServiceExtraction,function runExtraction,Yes +gateway.modules.features.aichat.serviceExtraction.subPipeline,(relative) .subRegistry,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPipeline,(relative) .subUtils,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPipeline,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPipeline,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPipeline,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,json,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,modules.shared.debugLogger,function buildExtractionPrompt,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,(relative) .chunking.chunkerImage,function __init__,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,(relative) .chunking.chunkerStructure,function __init__,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,(relative) .chunking.chunkerTable,function __init__,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,(relative) .chunking.chunkerText,function __init__,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,(relative) .extractors.extractorBinary,function _auto_discover_extractors,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,importlib,function _auto_discover_extractors,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,logging,header,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,os,function _auto_discover_extractors,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,pathlib,function _auto_discover_extractors,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,traceback,function _auto_discover_extractors,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,traceback,function __init__,Yes +gateway.modules.features.aichat.serviceExtraction.subRegistry,typing,header,Yes +gateway.modules.features.aichat.serviceExtraction.subUtils,uuid,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,(relative) .renderers.registry,function _getFormatRenderer,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.features.aichat.serviceExtraction.subPromptBuilderExtraction,function getAdaptiveExtractionPrompt,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.features.aichat.serviceGeneration.renderers.registry,function renderReport,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.features.aichat.serviceGeneration.subContentGenerator,function generateDocumentWithTwoPhases,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.features.aichat.serviceGeneration.subDocumentUtility,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,modules.features.aichat.serviceGeneration.subStructureGenerator,function generateDocumentWithTwoPhases,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,traceback,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.mainServiceGeneration,uuid,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.datamodels.datamodelDocument,function generateCode,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.features.aichat.serviceGeneration.renderers.registry,function _getCodeRenderer,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.shared.jsonContinuation,function _generateCodeStructure,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.shared.jsonContinuation,function _generateSingleFileContent,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,modules.shared.jsonUtils,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,re,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,time,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.codePath,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,copy,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,time,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.documentPath,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,base64,function generateImages,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,json,function generateImages,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,time,header,Yes +gateway.modules.features.aichat.serviceGeneration.paths.imagePath,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.codeRendererBaseTemplate,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.codeRendererBaseTemplate,abc,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.codeRendererBaseTemplate,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.codeRendererBaseTemplate,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.codeRendererBaseTemplate,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,PIL,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,abc,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,datetime,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,io,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,modules.datamodels.datamodelJson,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,re,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,re,function _determineFilename,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,threading,function _getAiStyles,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.documentRendererBaseTemplate,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,importlib,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,os,function discoverRenderers,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,pathlib,function discoverRenderers,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,sys,function discoverRenderers,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.registry,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeCsv,(relative) .codeRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeCsv,(relative) .rendererCsv,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeCsv,csv,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeCsv,io,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeCsv,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeCsv,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeJson,(relative) .codeRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeJson,(relative) .rendererJson,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeJson,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeJson,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeJson,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeXml,(relative) .codeRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeXml,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeXml,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeXml,xml.dom,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCodeXml,xml.etree.ElementTree,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCsv,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCsv,csv,function _convertRowsToCsv,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCsv,io,function _convertRowsToCsv,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCsv,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererCsv,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,(relative) .rendererHtml,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,PIL,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,csv,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.enum.style,function _setupDocumentStyles,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.enum.style,function _createStyle,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.enum.table,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.enum.text,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.ns,function _renderTableFastXml,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.shared,function _renderTableFastXml,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.shared,function _createTableBordersXml,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.shared,function _createTableRowXml,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.shared,function _applyHorizontalBordersOnly,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.shared,function _setCellBackground,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.oxml.shared,function _setCellBackgroundFast,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,docx.shared,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,io,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,lxml,function _renderTableFastXml,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,re,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,time,function _generateDocxFromJson,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,time,function _renderJsonTable,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,time,function _renderTableFastXml,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererDocx,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,base64,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,base64,function _replaceImageDataUris,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,html,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,html,function _replaceImageDataUris,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,re,function _replaceImageDataUris,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,re,function _extractImages,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererHtml,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,json,function _generateAiImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,modules.datamodels.datamodelAi,function _generateAiImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,modules.datamodels.datamodelAi,function _compressPromptWithAi,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererImage,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererJson,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererJson,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererJson,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererJson,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererJson,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererMarkdown,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererMarkdown,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererMarkdown,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererMarkdown,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,(relative) .rendererHtml,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,PIL,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,base64,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,io,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,io,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,json,function _getAiStylesWithPdfColors,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,modules.datamodels.datamodelAi,function _getAiStylesWithPdfColors,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,re,function _getAiStylesWithPdfColors,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,re,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib.enums,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib.pagesizes,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib.pagesizes,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib.styles,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib.units,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.lib.units,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.platypus,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,reportlab.platypus,function _renderJsonImage,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPdf,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,PIL,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,PIL,function _addImagesToSlideInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,PIL,function _addImagesToSlideInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,base64,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,base64,function _addImagesToSlideInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,datetime,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,io,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,io,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,io,function _addImagesToSlideInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _addTableToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _addBulletListToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _addHeadingToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _addParagraphToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _addCodeBlockToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _renderSlideContentWithFrames,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _renderTextSectionsInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.dml.color,function _renderSectionToTextFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _addTableToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _addBulletListToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _addParagraphToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _renderSlideContentWithFrames,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _renderTextSectionsInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _renderSectionToTextFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.enum.text,function _addImagesToSlideInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addTableToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addBulletListToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addHeadingToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addParagraphToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addCodeBlockToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _renderSlideContentWithFrames,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _renderTextSectionsInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _renderSectionToTextFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addImagesToSlideInFrame,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _renderSlideContentWithFrames,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,pptx.util,function _addBulletListToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,re,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,re,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,traceback,function _addImagesToSlide,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererPptx,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererText,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererText,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererText,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererText,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,(relative) .documentRendererBaseTemplate,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,(relative) .rendererCsv,function render,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,base64,function _addImageToExcel,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,datetime,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,dateutil,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,io,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,io,function _addImageToExcel,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,json,function _getAiStylesWithExcelColors,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,modules.datamodels.datamodelAi,function _getAiStylesWithExcelColors,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,modules.datamodels.datamodelDocument,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,modules.datamodels.datamodelJson,function getAcceptedSectionTypes,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,openpyxl,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,openpyxl.drawing.image,function _addImageToExcel,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,openpyxl.styles,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,openpyxl.utils,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,openpyxl.worksheet.table,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,re,header,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,re,function _getAiStylesWithExcelColors,Yes +gateway.modules.features.aichat.serviceGeneration.renderers.rendererXlsx,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,asyncio,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,base64,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,base64,function _generateImageSection,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,modules.datamodels.datamodelAi,function _generateSimpleSection,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,modules.datamodels.datamodelAi,function _generateImageSection,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,modules.features.aichat.serviceGeneration.subContentIntegrator,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,modules.shared.jsonUtils,function _generateSimpleSection,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,re,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,traceback,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentGenerator,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentIntegrator,json,function integrateContent,Yes +gateway.modules.features.aichat.serviceGeneration.subContentIntegrator,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.subContentIntegrator,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,csv,function convertDocumentDataToString,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,csv,function convertDocumentDataToString,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,io,function convertDocumentDataToString,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,io,function convertDocumentDataToString,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,os,header,Yes +gateway.modules.features.aichat.serviceGeneration.subDocumentUtility,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.subJsonSchema,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.subPromptBuilderGeneration,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.subPromptBuilderGeneration,modules.datamodels.datamodelJson,header,Yes +gateway.modules.features.aichat.serviceGeneration.subPromptBuilderGeneration,typing,header,Yes +gateway.modules.features.aichat.serviceGeneration.subStructureGenerator,json,header,Yes +gateway.modules.features.aichat.serviceGeneration.subStructureGenerator,json,function _createStructurePrompt,Yes +gateway.modules.features.aichat.serviceGeneration.subStructureGenerator,logging,header,Yes +gateway.modules.features.aichat.serviceGeneration.subStructureGenerator,modules.datamodels.datamodelAi,function generateStructure,Yes +gateway.modules.features.aichat.serviceGeneration.subStructureGenerator,modules.datamodels.datamodelJson,header,Yes +gateway.modules.features.aichat.serviceGeneration.subStructureGenerator,typing,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,asyncio,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,json,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,logging,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,time,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,time,function _processCrawlResultsWithHierarchy,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,typing,header,Yes +gateway.modules.features.aichat.serviceWeb.mainServiceWeb,urllib.parse,header,Yes +gateway.modules.features.automation.mainAutomation,logging,header,Yes +gateway.modules.features.automation.mainAutomation,typing,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,(relative) .subAutomationTemplates,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,fastapi,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,fastapi,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,fastapi.responses,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,fastapi.responses,function get_automations,Yes +gateway.modules.features.automation.routeFeatureAutomation,json,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,logging,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.auth,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.services,function execute_automation,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.shared.attributeUtils,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,modules.workflows.automation,header,Yes +gateway.modules.features.automation.routeFeatureAutomation,typing,header,Yes +gateway.modules.features.automation.subAutomationTemplates,typing,header,Yes +gateway.modules.features.automation.subAutomationUtils,datetime,header,Yes +gateway.modules.features.automation.subAutomationUtils,json,header,Yes +gateway.modules.features.automation.subAutomationUtils,typing,header,Yes +gateway.modules.features.chatbot.__init__,(relative) .mainChatbot,header,Yes +gateway.modules.features.chatbot.chatbotConstants,datetime,header,Yes +gateway.modules.features.chatbot.chatbotConstants,logging,header,Yes +gateway.modules.features.chatbot.chatbotConstants,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.chatbot.chatbotConstants,re,header,Yes +gateway.modules.features.chatbot.chatbotConstants,typing,header,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,enum,header,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,modules.datamodels.datamodelWorkflow,function updateFromSelection,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,modules.shared.attributeUtils,header,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,modules.shared.timeUtils,header,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,pydantic,header,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,typing,header,Yes +gateway.modules.features.chatbot.datamodelFeatureChatbot,uuid,header,Yes +gateway.modules.features.chatbot.eventManager,asyncio,header,Yes +gateway.modules.features.chatbot.eventManager,datetime,header,Yes +gateway.modules.features.chatbot.eventManager,logging,header,Yes +gateway.modules.features.chatbot.eventManager,typing,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,(relative) .datamodelFeatureChatbot,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,asyncio,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,datetime,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,json,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,logging,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,math,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.features.chatbot.eventManager,function createMessage,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.features.chatbot.eventManager,function createLog,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.interfaces.interfaceDbApp,function _enrichAutomationsWithUserAndMandate,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.interfaces.interfaceDbManagement,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.security.rbac,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.security.rootAccess,function setUserContext,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.shared.callbackRegistry,function _notifyAutomationChanged,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.shared.configuration,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.shared.debugLogger,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.shared.eventManagement,function deleteAutomationDefinition,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,modules.shared.timeUtils,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,os,function storeDebugMessageAndDocuments,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,typing,header,Yes +gateway.modules.features.chatbot.interfaceFeatureChatbot,uuid,header,Yes +gateway.modules.features.chatbot.mainChatbot,asyncio,header,Yes +gateway.modules.features.chatbot.mainChatbot,base64,header,Yes +gateway.modules.features.chatbot.mainChatbot,json,header,Yes +gateway.modules.features.chatbot.mainChatbot,logging,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.connectors.connectorPreprocessor,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.datamodels.datamodelAi,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.datamodels.datamodelDocref,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.features.aichat.datamodelFeatureAiChat,function _emit_log_and_event,Yes +gateway.modules.features.chatbot.mainChatbot,modules.features.chatbot.chatbotConstants,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.features.chatbot.chatbotConstants,function _processChatbotMessage,Yes +gateway.modules.features.chatbot.mainChatbot,modules.features.chatbot.eventManager,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.interfaces.interfaceRbac,function _convert_file_ids_to_document_references,Yes +gateway.modules.features.chatbot.mainChatbot,modules.services,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.shared.timeUtils,header,Yes +gateway.modules.features.chatbot.mainChatbot,modules.workflows.methods.methodAi.methodAi,header,Yes +gateway.modules.features.chatbot.mainChatbot,re,header,Yes +gateway.modules.features.chatbot.mainChatbot,typing,header,Yes +gateway.modules.features.chatbot.mainChatbot,uuid,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,(relative) .,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,(relative) .,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,(relative) .datamodelFeatureChatbot,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,(relative) .eventManager,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,asyncio,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,fastapi,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,fastapi.responses,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,json,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,logging,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,math,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,modules.auth,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,modules.datamodels.datamodelPagination,function get_chatbot_threads,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,modules.shared.timeUtils,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,modules.workflows.automation,header,Yes +gateway.modules.features.chatbot.routeFeatureChatbot,typing,header,Yes +gateway.modules.features.dynamicOptions.mainDynamicOptions,logging,header,Yes +gateway.modules.features.dynamicOptions.mainDynamicOptions,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.dynamicOptions.mainDynamicOptions,typing,header,Yes +gateway.modules.features.featureRegistry,fastapi,header,Yes +gateway.modules.features.featureRegistry,glob,header,Yes +gateway.modules.features.featureRegistry,importlib,header,Yes +gateway.modules.features.featureRegistry,logging,header,Yes +gateway.modules.features.featureRegistry,os,header,Yes +gateway.modules.features.featureRegistry,typing,header,Yes +gateway.modules.features.neutralizer.datamodelFeatureNeutralizer,modules.shared.attributeUtils,header,Yes +gateway.modules.features.neutralizer.datamodelFeatureNeutralizer,pydantic,header,Yes +gateway.modules.features.neutralizer.datamodelFeatureNeutralizer,typing,header,Yes +gateway.modules.features.neutralizer.datamodelFeatureNeutralizer,uuid,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,(relative) .datamodelFeatureNeutralizer,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,asyncio,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,logging,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,modules.datamodels.datamodelUam,function _getSharepointConnection,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,modules.services,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,modules.services.serviceSharepoint.mainServiceSharepoint,function processSharepointFiles,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,typing,header,Yes +gateway.modules.features.neutralizer.mainNeutralizePlayground,urllib.parse,header,Yes +gateway.modules.features.neutralizer.mainNeutralizer,logging,header,Yes +gateway.modules.features.neutralizer.mainNeutralizer,typing,header,Yes +gateway.modules.features.neutralizer.routeFeatureNeutralizer,(relative) .datamodelFeatureNeutralizer,header,Yes +gateway.modules.features.neutralizer.routeFeatureNeutralizer,(relative) .mainNeutralizePlayground,header,Yes +gateway.modules.features.neutralizer.routeFeatureNeutralizer,fastapi,header,Yes +gateway.modules.features.neutralizer.routeFeatureNeutralizer,logging,header,Yes +gateway.modules.features.neutralizer.routeFeatureNeutralizer,modules.auth,header,Yes +gateway.modules.features.neutralizer.routeFeatureNeutralizer,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,(relative) .subPatterns,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,(relative) .subProcessBinary,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,(relative) .subProcessCommon,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,(relative) .subProcessList,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,(relative) .subProcessText,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,json,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,logging,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,modules.features.neutralizer.datamodelFeatureNeutralizer,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,re,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.mainServiceNeutralization,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subParseString,(relative) .subPatterns,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subParseString,re,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subParseString,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subParseString,uuid,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subPatterns,dataclasses,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subPatterns,re,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subPatterns,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessBinary,base64,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessBinary,dataclasses,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessBinary,re,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessBinary,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessCommon,dataclasses,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessCommon,pydantic,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessCommon,re,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessCommon,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,(relative) .subParseString,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,(relative) .subPatterns,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,(relative) .subPatterns,function _anonymizeXmlElement,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,(relative) .subPatterns,function _anonymizeXmlElement,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,dataclasses,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,io,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,json,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,pandas,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,typing,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,uuid,function _anonymizeXmlElement,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,uuid,function _anonymizeTable,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,uuid,function _anonymizeXmlElement,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,uuid,function _anonymizeXmlElement,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,uuid,function _anonymizeXmlElement,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessList,xml.etree.ElementTree,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessText,(relative) .subParseString,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessText,dataclasses,header,Yes +gateway.modules.features.neutralizer.serviceNeutralization.subProcessText,typing,header,Yes +gateway.modules.features.realEstate.datamodelFeatureRealEstate,enum,header,Yes +gateway.modules.features.realEstate.datamodelFeatureRealEstate,modules.shared.attributeUtils,header,Yes +gateway.modules.features.realEstate.datamodelFeatureRealEstate,modules.shared.timeUtils,header,Yes +gateway.modules.features.realEstate.datamodelFeatureRealEstate,pydantic,header,Yes +gateway.modules.features.realEstate.datamodelFeatureRealEstate,typing,header,Yes +gateway.modules.features.realEstate.datamodelFeatureRealEstate,uuid,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,(relative) .datamodelFeatureRealEstate,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,logging,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.security.rbac,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.security.rootAccess,function setUserContext,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,modules.shared.configuration,header,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,re,function _isUUID,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,time,function executeQuery,Yes +gateway.modules.features.realEstate.interfaceFeatureRealEstate,typing,header,Yes +gateway.modules.features.realEstate.mainRealEstate,(relative) .datamodelFeatureRealEstate,header,Yes +gateway.modules.features.realEstate.mainRealEstate,(relative) .interfaceFeatureRealEstate,header,Yes +gateway.modules.features.realEstate.mainRealEstate,fastapi,header,Yes +gateway.modules.features.realEstate.mainRealEstate,json,header,Yes +gateway.modules.features.realEstate.mainRealEstate,logging,header,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.connectors.connectorSwissTopoMapServer,header,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.features.realestate.datamodelFeatureRealEstate,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,modules.services,header,Yes +gateway.modules.features.realEstate.mainRealEstate,re,function executeIntentBasedOperation,Yes +gateway.modules.features.realEstate.mainRealEstate,shapely.geometry,header,Yes +gateway.modules.features.realEstate.mainRealEstate,shapely.ops,header,Yes +gateway.modules.features.realEstate.mainRealEstate,typing,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,(relative) .datamodelFeatureRealEstate,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,(relative) .interfaceFeatureRealEstate,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,(relative) .mainRealEstate,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,fastapi,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,json,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,logging,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,modules.auth,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,modules.connectors.connectorSwissTopoMapServer,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,modules.shared.attributeUtils,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,requests,header,Yes +gateway.modules.features.realEstate.routeFeatureRealEstate,typing,header,Yes +gateway.modules.features.trustee.datamodelFeatureTrustee,modules.shared.attributeUtils,header,Yes +gateway.modules.features.trustee.datamodelFeatureTrustee,pydantic,header,Yes +gateway.modules.features.trustee.datamodelFeatureTrustee,typing,header,Yes +gateway.modules.features.trustee.datamodelFeatureTrustee,uuid,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,(relative) .datamodelFeatureTrustee,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,logging,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,math,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.datamodels.datamodelUam,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.security.rbac,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.security.rootAccess,function setUserContext,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,modules.shared.configuration,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,re,function createOrganisation,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,typing,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,uuid,header,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,uuid,function createAccess,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,uuid,function createContract,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,uuid,function createDocument,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,uuid,function createPosition,Yes +gateway.modules.features.trustee.interfaceFeatureTrustee,uuid,function createPositionDocument,Yes +gateway.modules.features.trustee.mainTrustee,logging,header,Yes +gateway.modules.features.trustee.mainTrustee,typing,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,(relative) .datamodelFeatureTrustee,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,(relative) .interfaceFeatureTrustee,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,fastapi,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,fastapi,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,fastapi.responses,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,io,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,json,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,logging,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,modules.auth,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,modules.interfaces.interfaceFeatures,header,Yes +gateway.modules.features.trustee.routeFeatureTrustee,typing,header,Yes +gateway.modules.interfaces.interfaceAiObjects,asyncio,header,Yes +gateway.modules.interfaces.interfaceAiObjects,base64,header,Yes +gateway.modules.interfaces.interfaceAiObjects,dataclasses,header,Yes +gateway.modules.interfaces.interfaceAiObjects,logging,header,Yes +gateway.modules.interfaces.interfaceAiObjects,modules.datamodels.datamodelAi,header,Yes +gateway.modules.interfaces.interfaceAiObjects,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.interfaces.interfaceAiObjects,modules.features.aichat.aicore.aicoreModelRegistry,header,Yes +gateway.modules.interfaces.interfaceAiObjects,modules.features.aichat.aicore.aicoreModelSelector,header,Yes +gateway.modules.interfaces.interfaceAiObjects,time,header,Yes +gateway.modules.interfaces.interfaceAiObjects,typing,header,Yes +gateway.modules.interfaces.interfaceAiObjects,uuid,header,Yes +gateway.modules.interfaces.interfaceBootstrap,logging,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.datamodels.datamodelMembership,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.shared.configuration,header,Yes +gateway.modules.interfaces.interfaceBootstrap,modules.shared.dbMultiTenantOptimizations,function _applyDatabaseOptimizations,Yes +gateway.modules.interfaces.interfaceBootstrap,passlib.context,header,Yes +gateway.modules.interfaces.interfaceBootstrap,typing,header,Yes +gateway.modules.interfaces.interfaceDbApp,logging,header,Yes +gateway.modules.interfaces.interfaceDbApp,math,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelFeatures,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelInvitation,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelMembership,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.features.neutralizer.datamodelFeatureNeutralizer,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.interfaces.interfaceBootstrap,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.security.rbac,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.security.rootAccess,function getRootInterface,Yes +gateway.modules.interfaces.interfaceDbApp,modules.shared.configuration,header,Yes +gateway.modules.interfaces.interfaceDbApp,modules.shared.timeUtils,header,Yes +gateway.modules.interfaces.interfaceDbApp,passlib.context,header,Yes +gateway.modules.interfaces.interfaceDbApp,typing,header,Yes +gateway.modules.interfaces.interfaceDbApp,uuid,header,Yes +gateway.modules.interfaces.interfaceDbManagement,base64,header,Yes +gateway.modules.interfaces.interfaceDbManagement,hashlib,header,Yes +gateway.modules.interfaces.interfaceDbManagement,logging,header,Yes +gateway.modules.interfaces.interfaceDbManagement,math,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelFiles,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelMessaging,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelUtils,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.datamodels.datamodelVoice,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.interfaces.interfaceDbApp,function _initializeStandardPrompts,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.security.rbac,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.security.rootAccess,function setUserContext,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.security.rootAccess,function _initializeStandardPrompts,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.shared.configuration,header,Yes +gateway.modules.interfaces.interfaceDbManagement,modules.shared.timeUtils,header,Yes +gateway.modules.interfaces.interfaceDbManagement,os,header,Yes +gateway.modules.interfaces.interfaceDbManagement,re,function _parse_size_string,Yes +gateway.modules.interfaces.interfaceDbManagement,typing,header,Yes +gateway.modules.interfaces.interfaceFeatures,logging,header,Yes +gateway.modules.interfaces.interfaceFeatures,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.interfaces.interfaceFeatures,modules.datamodels.datamodelFeatures,header,Yes +gateway.modules.interfaces.interfaceFeatures,modules.datamodels.datamodelMembership,function syncRolesFromTemplate,Yes +gateway.modules.interfaces.interfaceFeatures,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.interfaces.interfaceFeatures,typing,header,Yes +gateway.modules.interfaces.interfaceFeatures,uuid,header,Yes +gateway.modules.interfaces.interfaceMessaging,logging,header,Yes +gateway.modules.interfaces.interfaceMessaging,modules.connectors.connectorMessagingEmail,header,Yes +gateway.modules.interfaces.interfaceMessaging,modules.connectors.connectorMessagingSms,header,Yes +gateway.modules.interfaces.interfaceMessaging,modules.datamodels.datamodelMessaging,header,Yes +gateway.modules.interfaces.interfaceMessaging,typing,header,Yes +gateway.modules.interfaces.interfaceRbac,json,header,Yes +gateway.modules.interfaces.interfaceRbac,logging,header,Yes +gateway.modules.interfaces.interfaceRbac,modules.connectors.connectorDbPostgre,function getRecordsetWithRBAC,Yes +gateway.modules.interfaces.interfaceRbac,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.interfaces.interfaceRbac,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceRbac,modules.security.rbac,header,Yes +gateway.modules.interfaces.interfaceRbac,modules.security.rootAccess,header,Yes +gateway.modules.interfaces.interfaceRbac,pydantic,header,Yes +gateway.modules.interfaces.interfaceRbac,typing,header,Yes +gateway.modules.interfaces.interfaceTicketObjects,datetime,header,Yes +gateway.modules.interfaces.interfaceTicketObjects,modules.connectors.connectorTicketsClickup,function createTicketInterfaceByType,Yes +gateway.modules.interfaces.interfaceTicketObjects,modules.connectors.connectorTicketsJira,function createTicketInterfaceByType,Yes +gateway.modules.interfaces.interfaceTicketObjects,typing,header,Yes +gateway.modules.interfaces.interfaceVoiceObjects,logging,header,Yes +gateway.modules.interfaces.interfaceVoiceObjects,modules.connectors.connectorVoiceGoogle,header,Yes +gateway.modules.interfaces.interfaceVoiceObjects,modules.datamodels.datamodelUam,header,Yes +gateway.modules.interfaces.interfaceVoiceObjects,modules.datamodels.datamodelVoice,header,Yes +gateway.modules.interfaces.interfaceVoiceObjects,modules.shared.timeUtils,header,Yes +gateway.modules.interfaces.interfaceVoiceObjects,typing,header,Yes +gateway.modules.routes.routeAdmin,fastapi,header,Yes +gateway.modules.routes.routeAdmin,fastapi,header,Yes +gateway.modules.routes.routeAdmin,fastapi.responses,header,Yes +gateway.modules.routes.routeAdmin,fastapi.staticfiles,header,Yes +gateway.modules.routes.routeAdmin,logging,header,Yes +gateway.modules.routes.routeAdmin,modules.auth,header,Yes +gateway.modules.routes.routeAdmin,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeAdmin,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeAdmin,modules.shared.configuration,header,Yes +gateway.modules.routes.routeAdmin,os,header,Yes +gateway.modules.routes.routeAdmin,pathlib,header,Yes +gateway.modules.routes.routeAdmin,typing,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,fastapi,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,fastapi,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,logging,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.auth,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.features.aichat.interfaceFeatureAiChat,function sync_all_automation_events,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.interfaces.interfaceDbApp,function sync_all_automation_events,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.services,function sync_all_automation_events,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.shared.eventManagement,function get_all_automation_events,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.shared.eventManagement,function remove_event,Yes +gateway.modules.routes.routeAdminAutomationEvents,modules.workflows.automation,function sync_all_automation_events,Yes +gateway.modules.routes.routeAdminAutomationEvents,typing,header,Yes +gateway.modules.routes.routeAdminFeatures,fastapi,header,Yes +gateway.modules.routes.routeAdminFeatures,fastapi,header,Yes +gateway.modules.routes.routeAdminFeatures,logging,header,Yes +gateway.modules.routes.routeAdminFeatures,modules.auth,header,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelFeatures,header,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelMembership,function _getUserRoleInInstance,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelMembership,function _getInstancePermissions,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelMembership,function listFeatureInstanceUsers,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelMembership,function addUserToFeatureInstance,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelMembership,function removeUserFromFeatureInstance,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelMembership,function updateFeatureInstanceUserRoles,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelRbac,function _getUserRoleInInstance,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelRbac,function _getInstancePermissions,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelRbac,function listFeatureInstanceUsers,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelRbac,function getFeatureInstanceAvailableRoles,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelRbac,function _hasMandateAdminRole,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelUam,function listFeatureInstanceUsers,Yes +gateway.modules.routes.routeAdminFeatures,modules.datamodels.datamodelUam,function addUserToFeatureInstance,Yes +gateway.modules.routes.routeAdminFeatures,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeAdminFeatures,modules.interfaces.interfaceFeatures,header,Yes +gateway.modules.routes.routeAdminFeatures,pydantic,header,Yes +gateway.modules.routes.routeAdminFeatures,typing,header,Yes +gateway.modules.routes.routeAdminRbacExport,fastapi,header,Yes +gateway.modules.routes.routeAdminRbacExport,fastapi,header,Yes +gateway.modules.routes.routeAdminRbacExport,fastapi.responses,header,Yes +gateway.modules.routes.routeAdminRbacExport,json,header,Yes +gateway.modules.routes.routeAdminRbacExport,logging,header,Yes +gateway.modules.routes.routeAdminRbacExport,modules.auth,header,Yes +gateway.modules.routes.routeAdminRbacExport,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.routes.routeAdminRbacExport,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeAdminRbacExport,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeAdminRbacExport,modules.shared.timeUtils,header,Yes +gateway.modules.routes.routeAdminRbacExport,pydantic,header,Yes +gateway.modules.routes.routeAdminRbacExport,typing,header,Yes +gateway.modules.routes.routeAdminRbacRoles,fastapi,header,Yes +gateway.modules.routes.routeAdminRbacRoles,logging,header,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.auth,header,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.datamodels.datamodelMembership,header,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.datamodels.datamodelMembership,function listUsersWithRoles,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.datamodels.datamodelUam,function listUsersWithRoles,Yes +gateway.modules.routes.routeAdminRbacRoles,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeAdminRbacRoles,typing,header,Yes +gateway.modules.routes.routeAdminRbacRules,fastapi,header,Yes +gateway.modules.routes.routeAdminRbacRules,json,header,Yes +gateway.modules.routes.routeAdminRbacRules,logging,header,Yes +gateway.modules.routes.routeAdminRbacRules,math,header,Yes +gateway.modules.routes.routeAdminRbacRules,modules.auth,header,Yes +gateway.modules.routes.routeAdminRbacRules,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeAdminRbacRules,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.routes.routeAdminRbacRules,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeAdminRbacRules,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeAdminRbacRules,typing,header,Yes +gateway.modules.routes.routeAttributes,fastapi,header,Yes +gateway.modules.routes.routeAttributes,fastapi,header,Yes +gateway.modules.routes.routeAttributes,logging,header,Yes +gateway.modules.routes.routeAttributes,modules.auth,header,Yes +gateway.modules.routes.routeAttributes,modules.shared.attributeUtils,header,Yes +gateway.modules.routes.routeDataConnections,fastapi,header,Yes +gateway.modules.routes.routeDataConnections,fastapi,header,Yes +gateway.modules.routes.routeDataConnections,json,header,Yes +gateway.modules.routes.routeDataConnections,logging,header,Yes +gateway.modules.routes.routeDataConnections,math,header,Yes +gateway.modules.routes.routeDataConnections,modules.auth,header,Yes +gateway.modules.routes.routeDataConnections,modules.auth,function get_connections,Yes +gateway.modules.routes.routeDataConnections,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeDataConnections,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.routes.routeDataConnections,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeDataConnections,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeDataConnections,modules.interfaces.interfaceDbManagement,header,Yes +gateway.modules.routes.routeDataConnections,modules.shared.timeUtils,header,Yes +gateway.modules.routes.routeDataConnections,typing,header,Yes +gateway.modules.routes.routeDataFiles,fastapi,header,Yes +gateway.modules.routes.routeDataFiles,fastapi.responses,header,Yes +gateway.modules.routes.routeDataFiles,json,header,Yes +gateway.modules.routes.routeDataFiles,logging,header,Yes +gateway.modules.routes.routeDataFiles,modules.auth,header,Yes +gateway.modules.routes.routeDataFiles,modules.datamodels.datamodelFiles,header,Yes +gateway.modules.routes.routeDataFiles,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeDataFiles,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeDataFiles,modules.interfaces.interfaceDbManagement,header,Yes +gateway.modules.routes.routeDataFiles,modules.shared.attributeUtils,header,Yes +gateway.modules.routes.routeDataFiles,typing,header,Yes +gateway.modules.routes.routeDataFiles,urllib.parse,function download_file,Yes +gateway.modules.routes.routeDataMandates,fastapi,header,Yes +gateway.modules.routes.routeDataMandates,fastapi,header,Yes +gateway.modules.routes.routeDataMandates,json,header,Yes +gateway.modules.routes.routeDataMandates,logging,header,Yes +gateway.modules.routes.routeDataMandates,modules.auth,header,Yes +gateway.modules.routes.routeDataMandates,modules.datamodels.datamodelMembership,header,Yes +gateway.modules.routes.routeDataMandates,modules.datamodels.datamodelMembership,function delete_mandate,Yes +gateway.modules.routes.routeDataMandates,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeDataMandates,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.routes.routeDataMandates,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeDataMandates,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeDataMandates,modules.shared.attributeUtils,header,Yes +gateway.modules.routes.routeDataMandates,modules.shared.auditLogger,header,Yes +gateway.modules.routes.routeDataMandates,pydantic,header,Yes +gateway.modules.routes.routeDataMandates,typing,header,Yes +gateway.modules.routes.routeDataPrompts,fastapi,header,Yes +gateway.modules.routes.routeDataPrompts,fastapi,header,Yes +gateway.modules.routes.routeDataPrompts,json,header,Yes +gateway.modules.routes.routeDataPrompts,logging,header,Yes +gateway.modules.routes.routeDataPrompts,modules.auth,header,Yes +gateway.modules.routes.routeDataPrompts,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeDataPrompts,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeDataPrompts,modules.datamodels.datamodelUtils,header,Yes +gateway.modules.routes.routeDataPrompts,modules.interfaces.interfaceDbManagement,header,Yes +gateway.modules.routes.routeDataPrompts,typing,header,Yes +gateway.modules.routes.routeDataUsers,fastapi,header,Yes +gateway.modules.routes.routeDataUsers,fastapi,header,Yes +gateway.modules.routes.routeDataUsers,json,header,Yes +gateway.modules.routes.routeDataUsers,logging,header,Yes +gateway.modules.routes.routeDataUsers,math,function get_users,Yes +gateway.modules.routes.routeDataUsers,modules.auth,header,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelMembership,function delete_user,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelMembership,function update_user,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelMembership,function delete_user,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelMembership,function get_user,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelMembership,function reset_user_password,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelMembership,function sendPasswordLink,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelUam,function create_user,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelUam,function reset_user_password,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelUam,function change_password,Yes +gateway.modules.routes.routeDataUsers,modules.datamodels.datamodelUam,function get_users,Yes +gateway.modules.routes.routeDataUsers,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeDataUsers,modules.interfaces.interfaceDbApp,function sendPasswordLink,Yes +gateway.modules.routes.routeDataUsers,modules.services,function sendPasswordLink,Yes +gateway.modules.routes.routeDataUsers,modules.shared.auditLogger,function reset_user_password,Yes +gateway.modules.routes.routeDataUsers,modules.shared.auditLogger,function change_password,Yes +gateway.modules.routes.routeDataUsers,modules.shared.auditLogger,function sendPasswordLink,Yes +gateway.modules.routes.routeDataUsers,modules.shared.configuration,function sendPasswordLink,Yes +gateway.modules.routes.routeDataUsers,pydantic,header,Yes +gateway.modules.routes.routeDataUsers,typing,header,Yes +gateway.modules.routes.routeDataWorkflows,fastapi,header,Yes +gateway.modules.routes.routeDataWorkflows,json,header,Yes +gateway.modules.routes.routeDataWorkflows,logging,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.auth,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.interfaces.interfaceRbac,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.services,function get_all_actions,Yes +gateway.modules.routes.routeDataWorkflows,modules.services,function get_method_actions,Yes +gateway.modules.routes.routeDataWorkflows,modules.services,function get_action_schema,Yes +gateway.modules.routes.routeDataWorkflows,modules.shared.attributeUtils,header,Yes +gateway.modules.routes.routeDataWorkflows,modules.workflows.processing.shared.methodDiscovery,function get_all_actions,Yes +gateway.modules.routes.routeDataWorkflows,modules.workflows.processing.shared.methodDiscovery,function get_all_actions,Yes +gateway.modules.routes.routeDataWorkflows,modules.workflows.processing.shared.methodDiscovery,function get_method_actions,Yes +gateway.modules.routes.routeDataWorkflows,modules.workflows.processing.shared.methodDiscovery,function get_method_actions,Yes +gateway.modules.routes.routeDataWorkflows,modules.workflows.processing.shared.methodDiscovery,function get_action_schema,Yes +gateway.modules.routes.routeDataWorkflows,modules.workflows.processing.shared.methodDiscovery,function get_action_schema,Yes +gateway.modules.routes.routeDataWorkflows,typing,header,Yes +gateway.modules.routes.routeGdpr,datetime,function _timestampToIso,Yes +gateway.modules.routes.routeGdpr,fastapi,header,Yes +gateway.modules.routes.routeGdpr,fastapi,header,Yes +gateway.modules.routes.routeGdpr,fastapi.responses,header,Yes +gateway.modules.routes.routeGdpr,json,header,Yes +gateway.modules.routes.routeGdpr,logging,header,Yes +gateway.modules.routes.routeGdpr,modules.auth,header,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelFeatures,function exportUserData,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelInvitation,function exportUserData,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelInvitation,function deleteAccount,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelMembership,function exportUserData,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelMembership,function exportUserData,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelMembership,function exportPortableData,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelMembership,function deleteAccount,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelMembership,function deleteAccount,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelSecurity,function deleteAccount,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelUam,function deleteAccount,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelUam,function exportUserData,Yes +gateway.modules.routes.routeGdpr,modules.datamodels.datamodelUam,function exportPortableData,Yes +gateway.modules.routes.routeGdpr,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeGdpr,modules.shared.auditLogger,header,Yes +gateway.modules.routes.routeGdpr,modules.shared.timeUtils,header,Yes +gateway.modules.routes.routeGdpr,pydantic,header,Yes +gateway.modules.routes.routeGdpr,typing,header,Yes +gateway.modules.routes.routeInvitations,fastapi,header,Yes +gateway.modules.routes.routeInvitations,fastapi,header,Yes +gateway.modules.routes.routeInvitations,logging,header,Yes +gateway.modules.routes.routeInvitations,modules.auth,header,Yes +gateway.modules.routes.routeInvitations,modules.datamodels.datamodelFeatures,function createInvitation,Yes +gateway.modules.routes.routeInvitations,modules.datamodels.datamodelInvitation,header,Yes +gateway.modules.routes.routeInvitations,modules.datamodels.datamodelRbac,function _hasMandateAdminRole,Yes +gateway.modules.routes.routeInvitations,modules.datamodels.datamodelRbac,function _isInstanceRole,Yes +gateway.modules.routes.routeInvitations,modules.datamodels.datamodelRbac,function createInvitation,Yes +gateway.modules.routes.routeInvitations,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeInvitations,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeInvitations,modules.security.passwordUtils,function registerAndAcceptInvitation,No +gateway.modules.routes.routeInvitations,modules.shared.configuration,function createInvitation,Yes +gateway.modules.routes.routeInvitations,modules.shared.configuration,function listInvitations,Yes +gateway.modules.routes.routeInvitations,modules.shared.timeUtils,header,Yes +gateway.modules.routes.routeInvitations,pydantic,header,Yes +gateway.modules.routes.routeInvitations,typing,header,Yes +gateway.modules.routes.routeMessaging,fastapi,header,Yes +gateway.modules.routes.routeMessaging,fastapi,header,Yes +gateway.modules.routes.routeMessaging,json,header,Yes +gateway.modules.routes.routeMessaging,logging,header,Yes +gateway.modules.routes.routeMessaging,modules.auth,header,Yes +gateway.modules.routes.routeMessaging,modules.datamodels.datamodelMessaging,header,Yes +gateway.modules.routes.routeMessaging,modules.datamodels.datamodelPagination,header,Yes +gateway.modules.routes.routeMessaging,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.routes.routeMessaging,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeMessaging,modules.interfaces.interfaceDbApp,function _hasTriggerPermission,Yes +gateway.modules.routes.routeMessaging,modules.interfaces.interfaceDbManagement,header,Yes +gateway.modules.routes.routeMessaging,modules.services,function triggerSubscription,Yes +gateway.modules.routes.routeMessaging,typing,header,Yes +gateway.modules.routes.routeOptions,fastapi,header,Yes +gateway.modules.routes.routeOptions,logging,header,Yes +gateway.modules.routes.routeOptions,modules.auth,header,Yes +gateway.modules.routes.routeOptions,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeOptions,modules.features.dynamicOptions.mainDynamicOptions,header,Yes +gateway.modules.routes.routeOptions,modules.services,header,Yes +gateway.modules.routes.routeOptions,typing,header,Yes +gateway.modules.routes.routeSecurityAdmin,fastapi,header,Yes +gateway.modules.routes.routeSecurityAdmin,fastapi.responses,header,Yes +gateway.modules.routes.routeSecurityAdmin,logging,header,Yes +gateway.modules.routes.routeSecurityAdmin,modules.auth,header,Yes +gateway.modules.routes.routeSecurityAdmin,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.routes.routeSecurityAdmin,modules.datamodels.datamodelMembership,function revoke_tokens_by_mandate,Yes +gateway.modules.routes.routeSecurityAdmin,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.routes.routeSecurityAdmin,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeSecurityAdmin,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeSecurityAdmin,modules.shared.configuration,header,Yes +gateway.modules.routes.routeSecurityAdmin,os,header,Yes +gateway.modules.routes.routeSecurityAdmin,typing,header,Yes +gateway.modules.routes.routeSecurityGoogle,fastapi,header,Yes +gateway.modules.routes.routeSecurityGoogle,fastapi.responses,header,Yes +gateway.modules.routes.routeSecurityGoogle,httpx,header,Yes +gateway.modules.routes.routeSecurityGoogle,jose,function auth_callback,Yes +gateway.modules.routes.routeSecurityGoogle,json,header,Yes +gateway.modules.routes.routeSecurityGoogle,logging,header,Yes +gateway.modules.routes.routeSecurityGoogle,modules.auth,header,Yes +gateway.modules.routes.routeSecurityGoogle,modules.auth,header,Yes +gateway.modules.routes.routeSecurityGoogle,modules.auth,function verify_token,Yes +gateway.modules.routes.routeSecurityGoogle,modules.auth,function refresh_token,Yes +gateway.modules.routes.routeSecurityGoogle,modules.auth,function auth_callback,Yes +gateway.modules.routes.routeSecurityGoogle,modules.datamodels.datamodelSecurity,function auth_callback,Yes +gateway.modules.routes.routeSecurityGoogle,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeSecurityGoogle,modules.datamodels.datamodelUam,function login,Yes +gateway.modules.routes.routeSecurityGoogle,modules.datamodels.datamodelUam,function auth_callback,Yes +gateway.modules.routes.routeSecurityGoogle,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeSecurityGoogle,modules.shared.auditLogger,function logout,Yes +gateway.modules.routes.routeSecurityGoogle,modules.shared.configuration,header,Yes +gateway.modules.routes.routeSecurityGoogle,modules.shared.timeUtils,header,Yes +gateway.modules.routes.routeSecurityGoogle,requests_oauthlib,header,Yes +gateway.modules.routes.routeSecurityGoogle,typing,header,Yes +gateway.modules.routes.routeSecurityLocal,datetime,header,Yes +gateway.modules.routes.routeSecurityLocal,fastapi,header,Yes +gateway.modules.routes.routeSecurityLocal,fastapi.responses,header,Yes +gateway.modules.routes.routeSecurityLocal,fastapi.security,header,Yes +gateway.modules.routes.routeSecurityLocal,html,function _sendAuthEmail,Yes +gateway.modules.routes.routeSecurityLocal,jose,header,Yes +gateway.modules.routes.routeSecurityLocal,logging,header,Yes +gateway.modules.routes.routeSecurityLocal,modules.auth,header,Yes +gateway.modules.routes.routeSecurityLocal,modules.auth,header,Yes +gateway.modules.routes.routeSecurityLocal,modules.datamodels.datamodelMessaging,function _sendAuthEmail,Yes +gateway.modules.routes.routeSecurityLocal,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.routes.routeSecurityLocal,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeSecurityLocal,modules.datamodels.datamodelUam,function login,Yes +gateway.modules.routes.routeSecurityLocal,modules.datamodels.datamodelUam,function register_user,Yes +gateway.modules.routes.routeSecurityLocal,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeSecurityLocal,modules.interfaces.interfaceMessaging,function _sendAuthEmail,Yes +gateway.modules.routes.routeSecurityLocal,modules.shared.auditLogger,function login,Yes +gateway.modules.routes.routeSecurityLocal,modules.shared.auditLogger,function logout,Yes +gateway.modules.routes.routeSecurityLocal,modules.shared.auditLogger,function passwordReset,Yes +gateway.modules.routes.routeSecurityLocal,modules.shared.auditLogger,function login,Yes +gateway.modules.routes.routeSecurityLocal,modules.shared.configuration,header,Yes +gateway.modules.routes.routeSecurityLocal,typing,header,Yes +gateway.modules.routes.routeSecurityLocal,uuid,header,Yes +gateway.modules.routes.routeSecurityMsft,fastapi,header,Yes +gateway.modules.routes.routeSecurityMsft,fastapi.responses,header,Yes +gateway.modules.routes.routeSecurityMsft,httpx,header,Yes +gateway.modules.routes.routeSecurityMsft,jose,function auth_callback,Yes +gateway.modules.routes.routeSecurityMsft,json,header,Yes +gateway.modules.routes.routeSecurityMsft,logging,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.auth,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.auth,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.auth,function refresh_token,Yes +gateway.modules.routes.routeSecurityMsft,modules.auth,function refresh_token,Yes +gateway.modules.routes.routeSecurityMsft,modules.auth,function auth_callback,Yes +gateway.modules.routes.routeSecurityMsft,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.shared.auditLogger,function logout,Yes +gateway.modules.routes.routeSecurityMsft,modules.shared.configuration,header,Yes +gateway.modules.routes.routeSecurityMsft,modules.shared.timeUtils,header,Yes +gateway.modules.routes.routeSecurityMsft,msal,header,Yes +gateway.modules.routes.routeSecurityMsft,typing,header,Yes +gateway.modules.routes.routeSharepoint,fastapi,header,Yes +gateway.modules.routes.routeSharepoint,logging,header,Yes +gateway.modules.routes.routeSharepoint,modules.auth,header,Yes +gateway.modules.routes.routeSharepoint,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeSharepoint,modules.interfaces.interfaceDbApp,header,Yes +gateway.modules.routes.routeSharepoint,modules.services,header,Yes +gateway.modules.routes.routeSharepoint,typing,header,Yes +gateway.modules.routes.routeVoiceGoogle,base64,header,Yes +gateway.modules.routes.routeVoiceGoogle,fastapi,header,Yes +gateway.modules.routes.routeVoiceGoogle,fastapi.responses,header,Yes +gateway.modules.routes.routeVoiceGoogle,json,header,Yes +gateway.modules.routes.routeVoiceGoogle,logging,header,Yes +gateway.modules.routes.routeVoiceGoogle,modules.auth,header,Yes +gateway.modules.routes.routeVoiceGoogle,modules.datamodels.datamodelUam,header,Yes +gateway.modules.routes.routeVoiceGoogle,modules.interfaces.interfaceVoiceObjects,header,Yes +gateway.modules.routes.routeVoiceGoogle,typing,header,Yes +gateway.modules.security.__init__,(relative) .rbac,header,Yes +gateway.modules.security.__init__,(relative) .rbacHelpers,header,Yes +gateway.modules.security.__init__,(relative) .rootAccess,header,Yes +gateway.modules.security.rbac,logging,header,Yes +gateway.modules.security.rbac,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.security.rbac,modules.datamodels.datamodelMembership,header,Yes +gateway.modules.security.rbac,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.security.rbac,modules.datamodels.datamodelUam,header,Yes +gateway.modules.security.rbac,typing,header,Yes +gateway.modules.security.rbacCatalog,logging,header,Yes +gateway.modules.security.rbacCatalog,threading,header,Yes +gateway.modules.security.rbacCatalog,typing,header,Yes +gateway.modules.security.rbacHelpers,logging,header,Yes +gateway.modules.security.rbacHelpers,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.security.rbacHelpers,modules.datamodels.datamodelUam,header,Yes +gateway.modules.security.rbacHelpers,modules.security.rbac,header,Yes +gateway.modules.security.rbacHelpers,typing,header,Yes +gateway.modules.security.rootAccess,logging,header,Yes +gateway.modules.security.rootAccess,modules.connectors.connectorDbPostgre,header,Yes +gateway.modules.security.rootAccess,modules.datamodels.datamodelUam,header,Yes +gateway.modules.security.rootAccess,modules.interfaces.interfaceBootstrap,function _ensureBootstrap,Yes +gateway.modules.security.rootAccess,modules.shared.configuration,header,Yes +gateway.modules.services.__init__,(relative) .serviceChat.mainServiceChat,function __init__,Yes +gateway.modules.services.__init__,(relative) .serviceMessaging.mainServiceMessaging,function __init__,Yes +gateway.modules.services.__init__,(relative) .serviceSecurity.mainServiceSecurity,function __init__,Yes +gateway.modules.services.__init__,(relative) .serviceSharepoint.mainServiceSharepoint,function __init__,Yes +gateway.modules.services.__init__,(relative) .serviceTicket.mainServiceTicket,function __init__,Yes +gateway.modules.services.__init__,(relative) .serviceUtils.mainServiceUtils,function __init__,Yes +gateway.modules.services.__init__,glob,header,Yes +gateway.modules.services.__init__,importlib,header,Yes +gateway.modules.services.__init__,logging,header,Yes +gateway.modules.services.__init__,modules.datamodels.datamodelUam,header,Yes +gateway.modules.services.__init__,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.services.__init__,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.modules.services.__init__,modules.interfaces.interfaceDbManagement,function __init__,Yes +gateway.modules.services.__init__,os,header,Yes +gateway.modules.services.__init__,typing,header,Yes +gateway.modules.services.serviceChat.mainServiceChat,json,function calculateObjectSize,Yes +gateway.modules.services.serviceChat.mainServiceChat,logging,header,Yes +gateway.modules.services.serviceChat.mainServiceChat,modules.datamodels.datamodelAi,header,Yes +gateway.modules.services.serviceChat.mainServiceChat,modules.datamodels.datamodelDocref,function getChatDocumentsFromDocumentList,Yes +gateway.modules.services.serviceChat.mainServiceChat,modules.datamodels.datamodelUam,header,Yes +gateway.modules.services.serviceChat.mainServiceChat,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.services.serviceChat.mainServiceChat,modules.shared.progressLogger,header,Yes +gateway.modules.services.serviceChat.mainServiceChat,sys,function calculateObjectSize,Yes +gateway.modules.services.serviceChat.mainServiceChat,typing,header,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,html,function _textToHtml,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,importlib,function _loadSubscriptionFunction,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,logging,header,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,modules.datamodels.datamodelMessaging,header,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,modules.interfaces.interfaceMessaging,header,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,modules.shared.timeUtils,header,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,re,header,Yes +gateway.modules.services.serviceMessaging.mainServiceMessaging,typing,header,Yes +gateway.modules.services.serviceMessaging.subscriptions.subSubscriptionSystemErrors,modules.datamodels.datamodelMessaging,header,Yes +gateway.modules.services.serviceMessaging.subscriptions.subSubscriptionSystemErrors,typing,header,Yes +gateway.modules.services.serviceNormalization.mainServiceNormalization,json,header,Yes +gateway.modules.services.serviceNormalization.mainServiceNormalization,os,header,Yes +gateway.modules.services.serviceNormalization.mainServiceNormalization,typing,header,Yes +gateway.modules.services.serviceSecurity.mainServiceSecurity,logging,header,Yes +gateway.modules.services.serviceSecurity.mainServiceSecurity,modules.auth,header,Yes +gateway.modules.services.serviceSecurity.mainServiceSecurity,modules.datamodels.datamodelSecurity,header,Yes +gateway.modules.services.serviceSecurity.mainServiceSecurity,typing,header,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,aiohttp,header,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,asyncio,header,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,datetime,function getFolderUsageAnalytics,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,logging,header,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,typing,header,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,urllib.parse,function findSiteByWebUrl,Yes +gateway.modules.services.serviceSharepoint.mainServiceSharepoint,urllib.parse,function getSiteByStandardPath,Yes +gateway.modules.services.serviceTicket.mainServiceTicket,logging,header,Yes +gateway.modules.services.serviceTicket.mainServiceTicket,modules.interfaces.interfaceTicketObjects,header,Yes +gateway.modules.services.serviceTicket.mainServiceTicket,typing,header,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,json,function writeDebugArtifact,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,logging,header,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.features.aichat.interfaceFeatureAiChat,function storeDebugMessageAndDocuments,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared,header,No +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared.configuration,header,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared.debugLogger,function writeDebugFile,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared.debugLogger,function debugLogToFile,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared.debugLogger,function writeDebugArtifact,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared.eventManagement,header,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,modules.shared.timeUtils,header,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,re,function sanitizePromptContent,Yes +gateway.modules.services.serviceUtils.mainServiceUtils,typing,header,Yes +gateway.modules.shared.attributeUtils,importlib,header,Yes +gateway.modules.shared.attributeUtils,inspect,header,Yes +gateway.modules.shared.attributeUtils,logging,header,Yes +gateway.modules.shared.attributeUtils,os,header,Yes +gateway.modules.shared.attributeUtils,pydantic,header,Yes +gateway.modules.shared.attributeUtils,typing,header,Yes +gateway.modules.shared.auditLogger,datetime,header,Yes +gateway.modules.shared.auditLogger,logging,header,Yes +gateway.modules.shared.auditLogger,modules.connectors.connectorDbPostgre,function _ensureInitialized,Yes +gateway.modules.shared.auditLogger,modules.datamodels.datamodelAudit,function _ensureInitialized,Yes +gateway.modules.shared.auditLogger,modules.datamodels.datamodelAudit,function getAuditLogs,Yes +gateway.modules.shared.auditLogger,modules.datamodels.datamodelAudit,function cleanupOldEntries,Yes +gateway.modules.shared.auditLogger,modules.datamodels.datamodelAudit,function logEvent,Yes +gateway.modules.shared.auditLogger,modules.shared.configuration,header,Yes +gateway.modules.shared.auditLogger,modules.shared.eventManagement,function registerAuditLogCleanupScheduler,Yes +gateway.modules.shared.auditLogger,modules.shared.timeUtils,header,Yes +gateway.modules.shared.auditLogger,time,function cleanupOldEntries,Yes +gateway.modules.shared.auditLogger,typing,header,Yes +gateway.modules.shared.callbackRegistry,asyncio,header,Yes +gateway.modules.shared.callbackRegistry,logging,header,Yes +gateway.modules.shared.callbackRegistry,typing,header,Yes +gateway.modules.shared.configuration,base64,header,Yes +gateway.modules.shared.configuration,cryptography.fernet,header,Yes +gateway.modules.shared.configuration,cryptography.hazmat.primitives,header,Yes +gateway.modules.shared.configuration,cryptography.hazmat.primitives.kdf.pbkdf2,header,Yes +gateway.modules.shared.configuration,json,header,Yes +gateway.modules.shared.configuration,logging,header,Yes +gateway.modules.shared.configuration,modules.shared.auditLogger,function encryptValue,Yes +gateway.modules.shared.configuration,modules.shared.auditLogger,function decryptValue,Yes +gateway.modules.shared.configuration,modules.shared.auditLogger,function get,Yes +gateway.modules.shared.configuration,os,header,Yes +gateway.modules.shared.configuration,pathlib,header,Yes +gateway.modules.shared.configuration,time,header,Yes +gateway.modules.shared.configuration,typing,header,Yes +gateway.modules.shared.dbMultiTenantOptimizations,logging,header,Yes +gateway.modules.shared.dbMultiTenantOptimizations,typing,header,Yes +gateway.modules.shared.debugLogger,datetime,header,Yes +gateway.modules.shared.debugLogger,modules.shared.configuration,header,Yes +gateway.modules.shared.debugLogger,modules.shared.timeUtils,function debugLogToFile,Yes +gateway.modules.shared.debugLogger,os,header,Yes +gateway.modules.shared.debugLogger,typing,header,Yes +gateway.modules.shared.eventManagement,apscheduler.schedulers.asyncio,header,Yes +gateway.modules.shared.eventManagement,apscheduler.triggers.cron,header,Yes +gateway.modules.shared.eventManagement,apscheduler.triggers.interval,header,Yes +gateway.modules.shared.eventManagement,logging,header,Yes +gateway.modules.shared.eventManagement,typing,header,Yes +gateway.modules.shared.eventManagement,zoneinfo,header,Yes +gateway.modules.shared.frontendOptionsTypes,typing,header,Yes +gateway.modules.shared.frontendOptionsTypes,typing,header,Yes +gateway.modules.shared.frontendOptionsTypes,typing_extensions,header,Yes +gateway.modules.shared.frontendTypes,enum,header,Yes +gateway.modules.shared.frontendTypes,typing,header,Yes +gateway.modules.shared.jsonContinuation,dataclasses,header,Yes +gateway.modules.shared.jsonContinuation,enum,header,Yes +gateway.modules.shared.jsonContinuation,json,header,Yes +gateway.modules.shared.jsonContinuation,logging,header,Yes +gateway.modules.shared.jsonContinuation,modules.datamodels.datamodelAi,header,Yes +gateway.modules.shared.jsonContinuation,re,header,Yes +gateway.modules.shared.jsonContinuation,typing,header,Yes +gateway.modules.shared.jsonUtils,json,header,Yes +gateway.modules.shared.jsonUtils,logging,header,Yes +gateway.modules.shared.jsonUtils,modules.datamodels.datamodelAi,header,Yes +gateway.modules.shared.jsonUtils,modules.shared.jsonContinuation,function buildContinuationContext,Yes +gateway.modules.shared.jsonUtils,pydantic,header,Yes +gateway.modules.shared.jsonUtils,re,header,Yes +gateway.modules.shared.jsonUtils,typing,header,Yes +gateway.modules.shared.progressLogger,logging,header,Yes +gateway.modules.shared.progressLogger,time,header,Yes +gateway.modules.shared.progressLogger,typing,header,Yes +gateway.modules.shared.timeUtils,datetime,header,Yes +gateway.modules.shared.timeUtils,logging,header,Yes +gateway.modules.shared.timeUtils,time,header,Yes +gateway.modules.shared.timeUtils,typing,header,Yes +gateway.modules.workflows.automation.__init__,(relative) .mainWorkflow,header,Yes +gateway.modules.workflows.automation.mainWorkflow,(relative) .subAutomationUtils,header,Yes +gateway.modules.workflows.automation.mainWorkflow,json,header,Yes +gateway.modules.workflows.automation.mainWorkflow,logging,header,Yes +gateway.modules.workflows.automation.mainWorkflow,modules.datamodels.datamodelUam,header,Yes +gateway.modules.workflows.automation.mainWorkflow,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.automation.mainWorkflow,modules.services,header,Yes +gateway.modules.workflows.automation.mainWorkflow,modules.shared.eventManagement,header,Yes +gateway.modules.workflows.automation.mainWorkflow,modules.shared.timeUtils,header,Yes +gateway.modules.workflows.automation.mainWorkflow,modules.workflows.workflowManager,header,Yes +gateway.modules.workflows.automation.mainWorkflow,typing,header,Yes +gateway.modules.workflows.automation.subAutomationSchedule,logging,header,Yes +gateway.modules.workflows.automation.subAutomationSchedule,modules.services,header,Yes +gateway.modules.workflows.automation.subAutomationSchedule,modules.shared.callbackRegistry,function start,Yes +gateway.modules.workflows.automation.subAutomationSchedule,modules.workflows.automation,function start,Yes +gateway.modules.workflows.automation.subAutomationTemplates,typing,header,Yes +gateway.modules.workflows.automation.subAutomationUtils,datetime,header,Yes +gateway.modules.workflows.automation.subAutomationUtils,json,header,Yes +gateway.modules.workflows.automation.subAutomationUtils,typing,header,Yes +gateway.modules.workflows.methods.methodAi.__init__,(relative) .methodAi,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .convertDocument,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .generateCode,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .generateDocument,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .process,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .summarizeDocument,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .translateDocument,header,Yes +gateway.modules.workflows.methods.methodAi.actions.__init__,(relative) .webResearch,header,Yes +gateway.modules.workflows.methods.methodAi.actions.convertDocument,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.convertDocument,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.convertDocument,typing,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,modules.datamodels.datamodelAi,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,modules.datamodels.datamodelDocref,function generateCode,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,re,function generateCode,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,time,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateCode,typing,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,modules.datamodels.datamodelAi,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,modules.datamodels.datamodelDocref,function generateDocument,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,re,function generateDocument,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,time,header,Yes +gateway.modules.workflows.methods.methodAi.actions.generateDocument,typing,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,json,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelAi,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelAi,function process,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelAi,function process,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelDocref,function process,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelDocref,function process,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.datamodels.datamodelWorkflow,function process,Yes +gateway.modules.workflows.methods.methodAi.actions.process,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,time,header,Yes +gateway.modules.workflows.methods.methodAi.actions.process,typing,header,Yes +gateway.modules.workflows.methods.methodAi.actions.summarizeDocument,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.summarizeDocument,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.summarizeDocument,typing,header,Yes +gateway.modules.workflows.methods.methodAi.actions.translateDocument,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.translateDocument,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.translateDocument,typing,header,Yes +gateway.modules.workflows.methods.methodAi.actions.webResearch,logging,header,Yes +gateway.modules.workflows.methods.methodAi.actions.webResearch,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodAi.actions.webResearch,re,header,Yes +gateway.modules.workflows.methods.methodAi.actions.webResearch,time,header,Yes +gateway.modules.workflows.methods.methodAi.actions.webResearch,typing,header,Yes +gateway.modules.workflows.methods.methodAi.helpers.csvProcessing,logging,header,Yes +gateway.modules.workflows.methods.methodAi.helpers.csvProcessing,typing,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.convertDocument,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.generateCode,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.generateDocument,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.process,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.summarizeDocument,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.translateDocument,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .actions.webResearch,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,(relative) .helpers.csvProcessing,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,datetime,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,logging,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,modules.shared.frontendTypes,header,Yes +gateway.modules.workflows.methods.methodAi.methodAi,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.methods.methodBase,datetime,header,Yes +gateway.modules.workflows.methods.methodBase,functools,header,Yes +gateway.modules.workflows.methods.methodBase,inspect,header,Yes +gateway.modules.workflows.methods.methodBase,logging,header,Yes +gateway.modules.workflows.methods.methodBase,modules.datamodels.datamodelRbac,header,Yes +gateway.modules.workflows.methods.methodBase,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodBase,re,function _applyValidationRules,Yes +gateway.modules.workflows.methods.methodBase,re,function _generateMeaningfulFileName,Yes +gateway.modules.workflows.methods.methodBase,typing,header,Yes +gateway.modules.workflows.methods.methodChatbot.__init__,(relative) .methodChatbot,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,json,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,logging,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,modules.connectors.connectorPreprocessor,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,modules.datamodels.datamodelDocref,function queryDatabase,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,time,header,Yes +gateway.modules.workflows.methods.methodChatbot.actions.queryDatabase,typing,header,Yes +gateway.modules.workflows.methods.methodChatbot.methodChatbot,(relative) .actions.queryDatabase,header,Yes +gateway.modules.workflows.methods.methodChatbot.methodChatbot,logging,header,Yes +gateway.modules.workflows.methods.methodChatbot.methodChatbot,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodChatbot.methodChatbot,modules.shared.frontendTypes,header,Yes +gateway.modules.workflows.methods.methodChatbot.methodChatbot,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.methods.methodContext.__init__,(relative) .methodContext,header,Yes +gateway.modules.workflows.methods.methodContext.actions.__init__,(relative) .extractContent,header,Yes +gateway.modules.workflows.methods.methodContext.actions.__init__,(relative) .getDocumentIndex,header,Yes +gateway.modules.workflows.methods.methodContext.actions.__init__,(relative) .neutralizeData,header,Yes +gateway.modules.workflows.methods.methodContext.actions.__init__,(relative) .triggerPreprocessingServer,header,Yes +gateway.modules.workflows.methods.methodContext.actions.extractContent,logging,header,Yes +gateway.modules.workflows.methods.methodContext.actions.extractContent,modules.datamodels.datamodelDocref,header,Yes +gateway.modules.workflows.methods.methodContext.actions.extractContent,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.workflows.methods.methodContext.actions.extractContent,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodContext.actions.extractContent,time,header,Yes +gateway.modules.workflows.methods.methodContext.actions.extractContent,typing,header,Yes +gateway.modules.workflows.methods.methodContext.actions.getDocumentIndex,json,header,Yes +gateway.modules.workflows.methods.methodContext.actions.getDocumentIndex,logging,header,Yes +gateway.modules.workflows.methods.methodContext.actions.getDocumentIndex,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodContext.actions.getDocumentIndex,typing,header,Yes +gateway.modules.workflows.methods.methodContext.actions.neutralizeData,logging,header,Yes +gateway.modules.workflows.methods.methodContext.actions.neutralizeData,modules.datamodels.datamodelDocref,header,Yes +gateway.modules.workflows.methods.methodContext.actions.neutralizeData,modules.datamodels.datamodelExtraction,header,Yes +gateway.modules.workflows.methods.methodContext.actions.neutralizeData,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodContext.actions.neutralizeData,time,header,Yes +gateway.modules.workflows.methods.methodContext.actions.neutralizeData,typing,header,Yes +gateway.modules.workflows.methods.methodContext.actions.triggerPreprocessingServer,aiohttp,header,Yes +gateway.modules.workflows.methods.methodContext.actions.triggerPreprocessingServer,json,header,Yes +gateway.modules.workflows.methods.methodContext.actions.triggerPreprocessingServer,logging,header,Yes +gateway.modules.workflows.methods.methodContext.actions.triggerPreprocessingServer,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodContext.actions.triggerPreprocessingServer,modules.shared.configuration,header,Yes +gateway.modules.workflows.methods.methodContext.actions.triggerPreprocessingServer,typing,header,Yes +gateway.modules.workflows.methods.methodContext.helpers.documentIndex,datetime,header,Yes +gateway.modules.workflows.methods.methodContext.helpers.documentIndex,logging,header,Yes +gateway.modules.workflows.methods.methodContext.helpers.documentIndex,typing,header,Yes +gateway.modules.workflows.methods.methodContext.helpers.formatting,logging,header,Yes +gateway.modules.workflows.methods.methodContext.helpers.formatting,typing,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,(relative) .actions.extractContent,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,(relative) .actions.getDocumentIndex,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,(relative) .actions.neutralizeData,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,(relative) .actions.triggerPreprocessingServer,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,(relative) .helpers.documentIndex,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,(relative) .helpers.formatting,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,logging,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,modules.shared.frontendTypes,header,Yes +gateway.modules.workflows.methods.methodContext.methodContext,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.methods.methodJira.__init__,(relative) .methodJira,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .connectJira,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .createCsvContent,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .createExcelContent,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .exportTicketsAsJson,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .importTicketsFromJson,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .mergeTicketData,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .parseCsvContent,header,Yes +gateway.modules.workflows.methods.methodJira.actions.__init__,(relative) .parseExcelContent,header,Yes +gateway.modules.workflows.methods.methodJira.actions.connectJira,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.connectJira,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.connectJira,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.connectJira,modules.shared.configuration,header,Yes +gateway.modules.workflows.methods.methodJira.actions.connectJira,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.connectJira,uuid,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,base64,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,csv,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,datetime,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,io,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,pandas,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createCsvContent,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,base64,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,csv,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,datetime,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,io,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,pandas,header,Yes +gateway.modules.workflows.methods.methodJira.actions.createExcelContent,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.exportTicketsAsJson,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.exportTicketsAsJson,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.exportTicketsAsJson,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.exportTicketsAsJson,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.importTicketsFromJson,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.importTicketsFromJson,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.importTicketsFromJson,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.importTicketsFromJson,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.mergeTicketData,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.mergeTicketData,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.mergeTicketData,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.mergeTicketData,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseCsvContent,io,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseCsvContent,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseCsvContent,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseCsvContent,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseCsvContent,pandas,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseCsvContent,typing,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseExcelContent,io,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseExcelContent,json,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseExcelContent,logging,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseExcelContent,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseExcelContent,pandas,header,Yes +gateway.modules.workflows.methods.methodJira.actions.parseExcelContent,typing,header,Yes +gateway.modules.workflows.methods.methodJira.helpers.adfConverter,logging,header,Yes +gateway.modules.workflows.methods.methodJira.helpers.adfConverter,typing,header,Yes +gateway.modules.workflows.methods.methodJira.helpers.documentParsing,json,header,Yes +gateway.modules.workflows.methods.methodJira.helpers.documentParsing,logging,header,Yes +gateway.modules.workflows.methods.methodJira.helpers.documentParsing,modules.datamodels.datamodelDocref,header,Yes +gateway.modules.workflows.methods.methodJira.helpers.documentParsing,typing,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.connectJira,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.createCsvContent,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.createExcelContent,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.exportTicketsAsJson,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.importTicketsFromJson,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.mergeTicketData,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.parseCsvContent,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .actions.parseExcelContent,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .helpers.adfConverter,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,(relative) .helpers.documentParsing,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,logging,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,modules.shared.frontendTypes,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.methods.methodJira.methodJira,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.__init__,(relative) .methodOutlook,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.__init__,(relative) .composeAndDraftEmailWithContext,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.__init__,(relative) .readEmails,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.__init__,(relative) .searchEmails,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.__init__,(relative) .sendDraftEmail,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,base64,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,json,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.datamodels.datamodelDocref,function composeAndDraftEmailWithContext,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.datamodels.datamodelDocref,function composeAndDraftEmailWithContext,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.datamodels.datamodelDocref,function composeAndDraftEmailWithContext,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.datamodels.datamodelDocref,function composeAndDraftEmailWithContext,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.datamodels.datamodelDocref,function composeAndDraftEmailWithContext,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.datamodels.datamodelDocref,function composeAndDraftEmailWithContext,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,requests,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.composeAndDraftEmailWithContext,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.readEmails,json,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.readEmails,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.readEmails,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.readEmails,requests,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.readEmails,time,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.readEmails,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.searchEmails,json,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.searchEmails,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.searchEmails,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.searchEmails,requests,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.searchEmails,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,json,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,modules.datamodels.datamodelDocref,function sendDraftEmail,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,requests,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,time,header,Yes +gateway.modules.workflows.methods.methodOutlook.actions.sendDraftEmail,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.connection,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.connection,requests,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.connection,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.emailProcessing,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.emailProcessing,re,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.emailProcessing,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.folderManagement,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.folderManagement,requests,header,Yes +gateway.modules.workflows.methods.methodOutlook.helpers.folderManagement,typing,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .actions.composeAndDraftEmailWithContext,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .actions.readEmails,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .actions.searchEmails,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .actions.sendDraftEmail,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .helpers.connection,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .helpers.emailProcessing,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,(relative) .helpers.folderManagement,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,datetime,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,logging,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,modules.shared.frontendTypes,header,Yes +gateway.modules.workflows.methods.methodOutlook.methodOutlook,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.methods.methodSharepoint.__init__,(relative) .methodSharepoint,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .analyzeFolderUsage,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .copyFile,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .downloadFileByPath,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .findDocumentPath,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .findSiteByUrl,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .listDocuments,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .readDocuments,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .uploadDocument,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.__init__,(relative) .uploadFile,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.analyzeFolderUsage,datetime,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.analyzeFolderUsage,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.analyzeFolderUsage,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.analyzeFolderUsage,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.analyzeFolderUsage,time,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.analyzeFolderUsage,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.copyFile,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.copyFile,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.copyFile,modules.datamodels.datamodelDocref,function copyFile,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.copyFile,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.copyFile,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,base64,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,modules.datamodels.datamodelDocref,function downloadFileByPath,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,os,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.downloadFileByPath,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findDocumentPath,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findDocumentPath,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findDocumentPath,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findDocumentPath,time,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findDocumentPath,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findDocumentPath,urllib.parse,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findSiteByUrl,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findSiteByUrl,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findSiteByUrl,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.findSiteByUrl,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.listDocuments,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.listDocuments,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.listDocuments,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.listDocuments,time,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.listDocuments,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.listDocuments,urllib.parse,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.readDocuments,base64,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.readDocuments,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.readDocuments,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.readDocuments,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.readDocuments,time,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.readDocuments,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadDocument,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadDocument,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadDocument,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadDocument,time,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadDocument,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadDocument,urllib.parse,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,base64,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,modules.datamodels.datamodelDocref,function uploadFile,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,modules.datamodels.datamodelDocref,function uploadFile,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.methods.methodSharepoint.actions.uploadFile,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.apiClient,aiohttp,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.apiClient,asyncio,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.apiClient,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.apiClient,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.connection,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.connection,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.documentParsing,json,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.documentParsing,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.documentParsing,modules.datamodels.datamodelDocref,function parseDocumentListForFoundDocuments,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.documentParsing,modules.datamodels.datamodelDocref,function parseDocumentListForFolder,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.documentParsing,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.pathProcessing,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.pathProcessing,re,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.pathProcessing,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.siteDiscovery,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.siteDiscovery,typing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.helpers.siteDiscovery,urllib.parse,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.analyzeFolderUsage,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.copyFile,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.downloadFileByPath,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.findDocumentPath,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.findSiteByUrl,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.listDocuments,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.readDocuments,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.uploadDocument,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .actions.uploadFile,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .helpers.apiClient,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .helpers.connection,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .helpers.documentParsing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .helpers.pathProcessing,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,(relative) .helpers.siteDiscovery,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,logging,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,modules.datamodels.datamodelWorkflowActions,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,modules.shared.frontendTypes,header,Yes +gateway.modules.workflows.methods.methodSharepoint.methodSharepoint,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.processing.adaptive.__init__,(relative) .contentValidator,header,Yes +gateway.modules.workflows.processing.adaptive.__init__,(relative) .learningEngine,header,Yes +gateway.modules.workflows.processing.adaptive.__init__,(relative) .progressTracker,header,Yes +gateway.modules.workflows.processing.adaptive.adaptiveLearningEngine,collections,header,Yes +gateway.modules.workflows.processing.adaptive.adaptiveLearningEngine,datetime,header,Yes +gateway.modules.workflows.processing.adaptive.adaptiveLearningEngine,logging,header,Yes +gateway.modules.workflows.processing.adaptive.adaptiveLearningEngine,typing,header,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,base64,header,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,csv,function _extractCodeFileStatistics,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,io,function _extractCodeFileStatistics,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,json,header,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,logging,header,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,re,header,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,typing,header,Yes +gateway.modules.workflows.processing.adaptive.contentValidator,xml.etree.ElementTree,function _extractCodeFileStatistics,Yes +gateway.modules.workflows.processing.adaptive.learningEngine,datetime,header,Yes +gateway.modules.workflows.processing.adaptive.learningEngine,logging,header,Yes +gateway.modules.workflows.processing.adaptive.learningEngine,typing,header,Yes +gateway.modules.workflows.processing.adaptive.progressTracker,datetime,header,Yes +gateway.modules.workflows.processing.adaptive.progressTracker,logging,header,Yes +gateway.modules.workflows.processing.adaptive.progressTracker,typing,header,Yes +gateway.modules.workflows.processing.core.actionExecutor,logging,header,Yes +gateway.modules.workflows.processing.core.actionExecutor,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.core.actionExecutor,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.core.actionExecutor,modules.workflows.processing.core.messageCreator,function _createActionCompletionMessage,Yes +gateway.modules.workflows.processing.core.actionExecutor,modules.workflows.processing.shared.methodDiscovery,header,Yes +gateway.modules.workflows.processing.core.actionExecutor,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.processing.core.actionExecutor,time,function executeSingleAction,Yes +gateway.modules.workflows.processing.core.actionExecutor,typing,header,Yes +gateway.modules.workflows.processing.core.messageCreator,logging,header,Yes +gateway.modules.workflows.processing.core.messageCreator,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.core.messageCreator,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.core.messageCreator,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.processing.core.messageCreator,typing,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,json,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,logging,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,modules.datamodels.datamodelAi,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,modules.features.aichat.datamodelFeatureAiChat,function generateTaskPlan,Yes +gateway.modules.workflows.processing.core.taskPlanner,modules.workflows.processing.shared.promptGenerationTaskplan,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.processing.core.taskPlanner,typing,header,Yes +gateway.modules.workflows.processing.core.validator,logging,header,Yes +gateway.modules.workflows.processing.core.validator,typing,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,datetime,function _createActionItem,Yes +gateway.modules.workflows.processing.modes.modeAutomation,json,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,logging,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,modules.shared.timeUtils,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,modules.workflows.processing.modes.modeBase,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,typing,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,uuid,header,Yes +gateway.modules.workflows.processing.modes.modeAutomation,uuid,function _createActionItem,Yes +gateway.modules.workflows.processing.modes.modeBase,abc,header,Yes +gateway.modules.workflows.processing.modes.modeBase,logging,header,Yes +gateway.modules.workflows.processing.modes.modeBase,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.modes.modeBase,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.modes.modeBase,modules.workflows.processing.core.actionExecutor,header,Yes +gateway.modules.workflows.processing.modes.modeBase,modules.workflows.processing.core.messageCreator,header,Yes +gateway.modules.workflows.processing.modes.modeBase,modules.workflows.processing.core.taskPlanner,header,Yes +gateway.modules.workflows.processing.modes.modeBase,modules.workflows.processing.core.validator,header,Yes +gateway.modules.workflows.processing.modes.modeBase,typing,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,datetime,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,json,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,logging,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelAi,function _planSelect,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelAi,function _actExecute,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelAi,function _refineDecide,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelDocref,function _actExecute,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelDocref,function _planSelect,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelDocref,function _planSelect,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelWorkflow,function _planSelect,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.datamodels.datamodelWorkflow,function _actExecute,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.features.aichat.datamodelFeatureAiChat,function _refineDecide,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.features.aichat.datamodelFeatureAiChat,function _refineDecide,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.shared.jsonUtils,function _planSelect,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.shared.jsonUtils,function _actExecute,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.shared.jsonUtils,function _refineDecide,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.shared.timeUtils,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.adaptive,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.adaptive.adaptiveLearningEngine,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.modes.modeBase,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.shared.executionState,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.shared.methodDiscovery,function _actExecute,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.shared.methodDiscovery,function _actExecute,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.shared.placeholderFactory,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.shared.promptGenerationActionsDynamic,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,re,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,time,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,typing,header,Yes +gateway.modules.workflows.processing.modes.modeDynamic,uuid,function _createActionItem,Yes +gateway.modules.workflows.processing.modes.modeDynamic,uuid,function _createActionItem,Yes +gateway.modules.workflows.processing.shared.executionState,logging,header,Yes +gateway.modules.workflows.processing.shared.executionState,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.shared.executionState,typing,header,Yes +gateway.modules.workflows.processing.shared.methodDiscovery,importlib,header,Yes +gateway.modules.workflows.processing.shared.methodDiscovery,inspect,header,Yes +gateway.modules.workflows.processing.shared.methodDiscovery,logging,header,Yes +gateway.modules.workflows.processing.shared.methodDiscovery,modules.workflows.methods.methodBase,header,Yes +gateway.modules.workflows.processing.shared.methodDiscovery,pkgutil,header,Yes +gateway.modules.workflows.processing.shared.methodDiscovery,typing,header,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,json,header,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,logging,header,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,modules.features.aichat.datamodelFeatureAiChat,function extractReviewContent,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,modules.features.aichat.datamodelFeatureAiChat,function extractReviewContent,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,modules.features.aichat.interfaceFeatureAiChat,function extractLatestRefinementFeedback,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,modules.interfaces.interfaceDbApp,function extractLatestRefinementFeedback,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,modules.workflows.processing.shared.methodDiscovery,header,Yes +gateway.modules.workflows.processing.shared.placeholderFactory,typing,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationActionsDynamic,json,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationActionsDynamic,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationActionsDynamic,modules.workflows.processing.shared.methodDiscovery,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationActionsDynamic,modules.workflows.processing.shared.placeholderFactory,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationActionsDynamic,typing,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationTaskplan,logging,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationTaskplan,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationTaskplan,modules.workflows.processing.shared.placeholderFactory,header,Yes +gateway.modules.workflows.processing.shared.promptGenerationTaskplan,typing,header,Yes +gateway.modules.workflows.processing.shared.stateTools,logging,header,Yes +gateway.modules.workflows.processing.shared.stateTools,typing,header,Yes +gateway.modules.workflows.processing.workflowProcessor,json,header,Yes +gateway.modules.workflows.processing.workflowProcessor,logging,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.datamodels,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.datamodels.datamodelAi,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.datamodels.datamodelAi,function fastPathExecute,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.datamodels.datamodelWorkflow,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.datamodels.datamodelWorkflow,function initialUnderstanding,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.datamodels.datamodelWorkflow,function initialUnderstanding,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.features.aichat.datamodelFeatureAiChat,function fastPathExecute,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.features.aichat.datamodelFeatureAiChat,function persistTaskResult,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.shared.jsonUtils,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.shared.jsonUtils,function initialUnderstanding,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.workflows.processing.modes.modeAutomation,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.workflows.processing.modes.modeBase,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.workflows.processing.modes.modeDynamic,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.processing.workflowProcessor,modules.workflows.processing.shared.stateTools,function persistTaskResult,Yes +gateway.modules.workflows.processing.workflowProcessor,time,function generateTaskPlan,Yes +gateway.modules.workflows.processing.workflowProcessor,time,function executeTask,Yes +gateway.modules.workflows.processing.workflowProcessor,traceback,function fastPathExecute,Yes +gateway.modules.workflows.processing.workflowProcessor,typing,header,Yes +gateway.modules.workflows.workflowManager,asyncio,header,Yes +gateway.modules.workflows.workflowManager,json,header,Yes +gateway.modules.workflows.workflowManager,logging,header,Yes +gateway.modules.workflows.workflowManager,modules.datamodels.datamodelWorkflow,function _executeTasks,Yes +gateway.modules.workflows.workflowManager,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.workflowManager,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.modules.workflows.workflowManager,modules.features.aichat.datamodelFeatureAiChat,function _executeTasks,Yes +gateway.modules.workflows.workflowManager,modules.features.aichat.datamodelFeatureAiChat,function _sendFirstMessage,Yes +gateway.modules.workflows.workflowManager,modules.features.aichat.datamodelFeatureAiChat,function _sendFirstMessage,Yes +gateway.modules.workflows.workflowManager,modules.workflows.processing.shared.methodDiscovery,function workflowStart,Yes +gateway.modules.workflows.workflowManager,modules.workflows.processing.shared.methodDiscovery,function workflowStart,Yes +gateway.modules.workflows.workflowManager,modules.workflows.processing.shared.placeholderFactory,function _checkIfHistoryAvailable,Yes +gateway.modules.workflows.workflowManager,modules.workflows.processing.shared.stateTools,header,Yes +gateway.modules.workflows.workflowManager,modules.workflows.processing.workflowProcessor,header,Yes +gateway.modules.workflows.workflowManager,typing,header,Yes +gateway.modules.workflows.workflowManager,uuid,header,Yes +gateway.scripts.script_analyze_imports,ast,header,Yes +gateway.scripts.script_analyze_imports,csv,header,Yes +gateway.scripts.script_analyze_imports,os,header,Yes +gateway.scripts.script_analyze_imports,pathlib,header,Yes +gateway.scripts.script_analyze_imports,sys,header,Yes +gateway.scripts.script_analyze_imports,typing,header,Yes +gateway.scripts.script_db_adapt_to_models,argparse,header,Yes +gateway.scripts.script_db_adapt_to_models,ast,function _parsePydanticModels,Yes +gateway.scripts.script_db_adapt_to_models,ast,function _extractType,Yes +gateway.scripts.script_db_adapt_to_models,json,header,Yes +gateway.scripts.script_db_adapt_to_models,logging,header,Yes +gateway.scripts.script_db_adapt_to_models,modules.shared.configuration,header,Yes +gateway.scripts.script_db_adapt_to_models,os,header,Yes +gateway.scripts.script_db_adapt_to_models,pathlib,header,Yes +gateway.scripts.script_db_adapt_to_models,psycopg2,header,Yes +gateway.scripts.script_db_adapt_to_models,psycopg2.extras,header,Yes +gateway.scripts.script_db_adapt_to_models,sys,header,Yes +gateway.scripts.script_db_adapt_to_models,typing,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,argparse,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,dotenv,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,logging,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,modules.datamodels.datamodelRbac,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,modules.security.rootAccess,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,os,header,Yes +gateway.scripts.script_db_cleanup_duplicate_roles,sys,header,Yes +gateway.scripts.script_db_export_migration,argparse,header,Yes +gateway.scripts.script_db_export_migration,datetime,header,Yes +gateway.scripts.script_db_export_migration,json,header,Yes +gateway.scripts.script_db_export_migration,logging,header,Yes +gateway.scripts.script_db_export_migration,modules.shared.configuration,header,Yes +gateway.scripts.script_db_export_migration,os,header,Yes +gateway.scripts.script_db_export_migration,pathlib,header,Yes +gateway.scripts.script_db_export_migration,psycopg2,header,Yes +gateway.scripts.script_db_export_migration,psycopg2.extras,header,Yes +gateway.scripts.script_db_export_migration,sys,header,Yes +gateway.scripts.script_db_export_migration,typing,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,argparse,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,datetime,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,modules.shared.configuration,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,pathlib,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,shutil,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,sys,header,Yes +gateway.scripts.script_security_encrypt_all_env_files,typing,header,Yes +gateway.scripts.script_security_encrypt_config_value,argparse,header,Yes +gateway.scripts.script_security_encrypt_config_value,datetime,header,Yes +gateway.scripts.script_security_encrypt_config_value,json,header,Yes +gateway.scripts.script_security_encrypt_config_value,modules.shared.configuration,header,Yes +gateway.scripts.script_security_encrypt_config_value,modules.shared.configuration,function main,Yes +gateway.scripts.script_security_encrypt_config_value,os,header,Yes +gateway.scripts.script_security_encrypt_config_value,pathlib,header,Yes +gateway.scripts.script_security_encrypt_config_value,shutil,header,Yes +gateway.scripts.script_security_encrypt_config_value,sys,header,Yes +gateway.scripts.script_security_generate_master_keys,argparse,header,Yes +gateway.scripts.script_security_generate_master_keys,base64,header,Yes +gateway.scripts.script_security_generate_master_keys,os,header,Yes +gateway.scripts.script_security_generate_master_keys,pathlib,header,Yes +gateway.scripts.script_security_generate_master_keys,secrets,header,Yes +gateway.scripts.script_security_generate_master_keys,sys,header,Yes +gateway.scripts.script_stats_durations_from_log,argparse,header,Yes +gateway.scripts.script_stats_durations_from_log,csv,header,Yes +gateway.scripts.script_stats_durations_from_log,datetime,header,Yes +gateway.scripts.script_stats_durations_from_log,re,header,Yes +gateway.scripts.script_stats_durations_from_log,typing,header,Yes +gateway.scripts.script_stats_get_codelines,argparse,header,Yes +gateway.scripts.script_stats_get_codelines,os,header,Yes +gateway.scripts.script_stats_get_codelines,pathlib,header,Yes +gateway.scripts.script_stats_get_codelines,typing,header,Yes +gateway.scripts.script_stats_showUnusedFunctions,ast,header,Yes +gateway.scripts.script_stats_showUnusedFunctions,logging,header,Yes +gateway.scripts.script_stats_showUnusedFunctions,os,header,Yes +gateway.scripts.script_stats_showUnusedFunctions,pathlib,header,Yes +gateway.scripts.script_stats_showUnusedFunctions,re,header,Yes +gateway.scripts.script_stats_showUnusedFunctions,typing,header,Yes +gateway.tests.conftest,os,header,Yes +gateway.tests.conftest,pathlib,header,Yes +gateway.tests.conftest,sys,header,Yes +gateway.tests.functional.test01_ai_model_selection,asyncio,header,Yes +gateway.tests.functional.test01_ai_model_selection,base64,header,Yes +gateway.tests.functional.test01_ai_model_selection,modules.datamodels.datamodelAi,header,Yes +gateway.tests.functional.test01_ai_model_selection,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test01_ai_model_selection,modules.features.aichat.aicore.aicoreModelRegistry,header,Yes +gateway.tests.functional.test01_ai_model_selection,modules.features.aichat.aicore.aicoreModelSelector,header,Yes +gateway.tests.functional.test01_ai_model_selection,modules.features.aichat.serviceAi.mainServiceAi,function initialize,Yes +gateway.tests.functional.test01_ai_model_selection,modules.interfaces.interfaceAiObjects,function initialize,Yes +gateway.tests.functional.test01_ai_model_selection,modules.services,header,Yes +gateway.tests.functional.test01_ai_model_selection,os,header,Yes +gateway.tests.functional.test01_ai_model_selection,sys,header,Yes +gateway.tests.functional.test02_ai_models,asyncio,header,Yes +gateway.tests.functional.test02_ai_models,base64,header,Yes +gateway.tests.functional.test02_ai_models,base64,function _createTestImage,Yes +gateway.tests.functional.test02_ai_models,base64,function _saveImageResponse,Yes +gateway.tests.functional.test02_ai_models,base64,function testModelOperation,Yes +gateway.tests.functional.test02_ai_models,collections,function printTestSummary,Yes +gateway.tests.functional.test02_ai_models,datetime,header,Yes +gateway.tests.functional.test02_ai_models,json,header,Yes +gateway.tests.functional.test02_ai_models,json,function testModelOperation,Yes +gateway.tests.functional.test02_ai_models,json,function testModelOperation,Yes +gateway.tests.functional.test02_ai_models,logging,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.datamodels.datamodelAi,header,Yes +gateway.tests.functional.test02_ai_models,modules.datamodels.datamodelAi,function _getTestPromptForOperation,Yes +gateway.tests.functional.test02_ai_models,modules.datamodels.datamodelAi,function getAllAvailableModels,Yes +gateway.tests.functional.test02_ai_models,modules.datamodels.datamodelAi,function testModelOperation,Yes +gateway.tests.functional.test02_ai_models,modules.datamodels.datamodelAi,function testModelOperation,Yes +gateway.tests.functional.test02_ai_models,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.aicore.aicoreModelRegistry,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.aicore.aicoreModelRegistry,function testModel,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.aicore.aicoreModelRegistry,function getAllAvailableModels,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.aicore.aicorePluginPerplexity,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.aicore.aicorePluginTavily,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.datamodelFeatureAiChat,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.serviceAi.mainServiceAi,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.features.aichat.serviceExtraction.mainServiceExtraction,function initialize,Yes +gateway.tests.functional.test02_ai_models,modules.services,header,Yes +gateway.tests.functional.test02_ai_models,modules.shared.configuration,function _testTavilyDirect,Yes +gateway.tests.functional.test02_ai_models,os,header,Yes +gateway.tests.functional.test02_ai_models,sys,header,Yes +gateway.tests.functional.test02_ai_models,tavily,function _testTavilyDirect,Yes +gateway.tests.functional.test02_ai_models,typing,header,Yes +gateway.tests.functional.test02_ai_models,uuid,function initialize,Yes +gateway.tests.functional.test03_ai_operations,asyncio,header,Yes +gateway.tests.functional.test03_ai_operations,datetime,header,Yes +gateway.tests.functional.test03_ai_operations,json,function printSummary,Yes +gateway.tests.functional.test03_ai_operations,json,function testOperation,Yes +gateway.tests.functional.test03_ai_operations,logging,function initialize,Yes +gateway.tests.functional.test03_ai_operations,modules.datamodels.datamodelAi,header,Yes +gateway.tests.functional.test03_ai_operations,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test03_ai_operations,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.functional.test03_ai_operations,modules.features.aichat.datamodelFeatureAiChat,function _prepareTestImageDocument,Yes +gateway.tests.functional.test03_ai_operations,modules.features.aichat.datamodelFeatureAiChat,function _prepareTestImageDocument,Yes +gateway.tests.functional.test03_ai_operations,modules.features.aichat.interfaceFeatureAiChat,function initialize,Yes +gateway.tests.functional.test03_ai_operations,modules.features.aichat.interfaceFeatureAiChat,function _prepareTestImageDocument,Yes +gateway.tests.functional.test03_ai_operations,modules.features.aichat.interfaceFeatureAiChat,function testOperation,Yes +gateway.tests.functional.test03_ai_operations,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test03_ai_operations,modules.services,function initialize,Yes +gateway.tests.functional.test03_ai_operations,modules.workflows.methods.methodAi,function initialize,Yes +gateway.tests.functional.test03_ai_operations,os,header,Yes +gateway.tests.functional.test03_ai_operations,sys,header,Yes +gateway.tests.functional.test03_ai_operations,time,function initialize,Yes +gateway.tests.functional.test03_ai_operations,time,function _prepareTestImageDocument,Yes +gateway.tests.functional.test03_ai_operations,time,function testOperation,Yes +gateway.tests.functional.test03_ai_operations,typing,header,Yes +gateway.tests.functional.test03_ai_operations,uuid,function initialize,Yes +gateway.tests.functional.test03_ai_operations,uuid,function _prepareTestImageDocument,Yes +gateway.tests.functional.test03_ai_operations,uuid,function testOperation,Yes +gateway.tests.functional.test04_ai_behavior,asyncio,header,Yes +gateway.tests.functional.test04_ai_behavior,glob,function _getLatestDebugResponse,Yes +gateway.tests.functional.test04_ai_behavior,json,header,Yes +gateway.tests.functional.test04_ai_behavior,logging,function initialize,Yes +gateway.tests.functional.test04_ai_behavior,modules.datamodels.datamodelAi,header,Yes +gateway.tests.functional.test04_ai_behavior,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test04_ai_behavior,modules.datamodels.datamodelWorkflow,header,Yes +gateway.tests.functional.test04_ai_behavior,modules.features.aichat.datamodelFeatureAiChat,function initialize,Yes +gateway.tests.functional.test04_ai_behavior,modules.features.aichat.interfaceFeatureAiChat,function initialize,Yes +gateway.tests.functional.test04_ai_behavior,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test04_ai_behavior,modules.services,header,Yes +gateway.tests.functional.test04_ai_behavior,os,header,Yes +gateway.tests.functional.test04_ai_behavior,sys,header,Yes +gateway.tests.functional.test04_ai_behavior,time,function initialize,Yes +gateway.tests.functional.test04_ai_behavior,traceback,function testPromptBehavior,Yes +gateway.tests.functional.test04_ai_behavior,typing,header,Yes +gateway.tests.functional.test04_ai_behavior,uuid,function initialize,Yes +gateway.tests.functional.test05_workflow_with_documents,asyncio,header,Yes +gateway.tests.functional.test05_workflow_with_documents,json,header,Yes +gateway.tests.functional.test05_workflow_with_documents,logging,function initialize,Yes +gateway.tests.functional.test05_workflow_with_documents,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test05_workflow_with_documents,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.functional.test05_workflow_with_documents,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.tests.functional.test05_workflow_with_documents,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test05_workflow_with_documents,modules.services,header,Yes +gateway.tests.functional.test05_workflow_with_documents,modules.workflows.automation,header,Yes +gateway.tests.functional.test05_workflow_with_documents,os,header,Yes +gateway.tests.functional.test05_workflow_with_documents,sys,header,Yes +gateway.tests.functional.test05_workflow_with_documents,time,header,Yes +gateway.tests.functional.test05_workflow_with_documents,traceback,function runTest,Yes +gateway.tests.functional.test05_workflow_with_documents,typing,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,asyncio,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,json,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,logging,function initialize,Yes +gateway.tests.functional.test06_workflow_prompt_variations,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test06_workflow_prompt_variations,modules.services,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,modules.workflows.automation,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,os,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,sys,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,time,header,Yes +gateway.tests.functional.test06_workflow_prompt_variations,traceback,function testSimplePrompt,Yes +gateway.tests.functional.test06_workflow_prompt_variations,traceback,function testMergeDocumentsToWord,Yes +gateway.tests.functional.test06_workflow_prompt_variations,traceback,function testStructuredDataToExcel,Yes +gateway.tests.functional.test06_workflow_prompt_variations,traceback,function runAllTests,Yes +gateway.tests.functional.test06_workflow_prompt_variations,typing,header,Yes +gateway.tests.functional.test07_json_merge,json,header,Yes +gateway.tests.functional.test07_json_merge,modules.features.aichat.serviceAi.subJsonResponseHandling,header,Yes +gateway.tests.functional.test07_json_merge,modules.shared.jsonUtils,header,Yes +gateway.tests.functional.test07_json_merge,os,header,Yes +gateway.tests.functional.test07_json_merge,sys,header,Yes +gateway.tests.functional.test07_json_merge,traceback,header,Yes +gateway.tests.functional.test08_json_finalization,json,header,Yes +gateway.tests.functional.test08_json_finalization,modules.features.aichat.serviceAi.subJsonResponseHandling,header,Yes +gateway.tests.functional.test08_json_finalization,modules.shared.jsonUtils,header,Yes +gateway.tests.functional.test08_json_finalization,os,header,Yes +gateway.tests.functional.test08_json_finalization,sys,header,Yes +gateway.tests.functional.test08_json_finalization,traceback,function testEndToEndFinalizationWithCorruption,Yes +gateway.tests.functional.test08_json_finalization,traceback,header,Yes +gateway.tests.functional.test09_document_generation_formats,asyncio,header,Yes +gateway.tests.functional.test09_document_generation_formats,base64,header,Yes +gateway.tests.functional.test09_document_generation_formats,json,header,Yes +gateway.tests.functional.test09_document_generation_formats,logging,function initialize,Yes +gateway.tests.functional.test09_document_generation_formats,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test09_document_generation_formats,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.functional.test09_document_generation_formats,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.tests.functional.test09_document_generation_formats,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test09_document_generation_formats,modules.services,header,Yes +gateway.tests.functional.test09_document_generation_formats,modules.shared.configuration,function initialize,Yes +gateway.tests.functional.test09_document_generation_formats,modules.workflows.automation,header,Yes +gateway.tests.functional.test09_document_generation_formats,os,header,Yes +gateway.tests.functional.test09_document_generation_formats,sys,header,Yes +gateway.tests.functional.test09_document_generation_formats,time,header,Yes +gateway.tests.functional.test09_document_generation_formats,traceback,function uploadPdfFile,Yes +gateway.tests.functional.test09_document_generation_formats,traceback,function runTest,Yes +gateway.tests.functional.test09_document_generation_formats,traceback,function testRefactoringFeatures,Yes +gateway.tests.functional.test09_document_generation_formats,traceback,function testAllFormats,Yes +gateway.tests.functional.test09_document_generation_formats,typing,header,Yes +gateway.tests.functional.test10_document_generation_formats,asyncio,header,Yes +gateway.tests.functional.test10_document_generation_formats,base64,header,Yes +gateway.tests.functional.test10_document_generation_formats,json,header,Yes +gateway.tests.functional.test10_document_generation_formats,logging,function initialize,Yes +gateway.tests.functional.test10_document_generation_formats,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test10_document_generation_formats,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.functional.test10_document_generation_formats,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.tests.functional.test10_document_generation_formats,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test10_document_generation_formats,modules.services,header,Yes +gateway.tests.functional.test10_document_generation_formats,modules.shared.configuration,function initialize,Yes +gateway.tests.functional.test10_document_generation_formats,modules.workflows.automation,header,Yes +gateway.tests.functional.test10_document_generation_formats,os,header,Yes +gateway.tests.functional.test10_document_generation_formats,sys,header,Yes +gateway.tests.functional.test10_document_generation_formats,time,header,Yes +gateway.tests.functional.test10_document_generation_formats,traceback,function uploadPdfFile,Yes +gateway.tests.functional.test10_document_generation_formats,traceback,function runTest,Yes +gateway.tests.functional.test10_document_generation_formats,traceback,function testAllFormats,Yes +gateway.tests.functional.test10_document_generation_formats,typing,header,Yes +gateway.tests.functional.test11_code_generation_formats,asyncio,header,Yes +gateway.tests.functional.test11_code_generation_formats,csv,header,Yes +gateway.tests.functional.test11_code_generation_formats,io,header,Yes +gateway.tests.functional.test11_code_generation_formats,json,header,Yes +gateway.tests.functional.test11_code_generation_formats,logging,function initialize,Yes +gateway.tests.functional.test11_code_generation_formats,modules.datamodels.datamodelUam,header,Yes +gateway.tests.functional.test11_code_generation_formats,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.functional.test11_code_generation_formats,modules.features.aichat.interfaceFeatureAiChat,header,Yes +gateway.tests.functional.test11_code_generation_formats,modules.interfaces.interfaceDbApp,function __init__,Yes +gateway.tests.functional.test11_code_generation_formats,modules.services,header,Yes +gateway.tests.functional.test11_code_generation_formats,modules.shared.configuration,function initialize,Yes +gateway.tests.functional.test11_code_generation_formats,modules.workflows.automation,header,Yes +gateway.tests.functional.test11_code_generation_formats,os,header,Yes +gateway.tests.functional.test11_code_generation_formats,sys,header,Yes +gateway.tests.functional.test11_code_generation_formats,time,header,Yes +gateway.tests.functional.test11_code_generation_formats,traceback,function runTest,Yes +gateway.tests.functional.test11_code_generation_formats,traceback,function testAllFormats,Yes +gateway.tests.functional.test11_code_generation_formats,typing,header,Yes +gateway.tests.functional.test11_code_generation_formats,xml.etree.ElementTree,header,Yes +gateway.tests.functional.test12_json_split_merge,asyncio,header,Yes +gateway.tests.functional.test12_json_split_merge,json,header,Yes +gateway.tests.functional.test12_json_split_merge,modules.features.aichat.serviceAi.subJsonMerger,header,Yes +gateway.tests.functional.test12_json_split_merge,modules.shared.jsonContinuation,header,Yes +gateway.tests.functional.test12_json_split_merge,modules.shared.jsonUtils,function _loadTableJsonExample,Yes +gateway.tests.functional.test12_json_split_merge,modules.shared.jsonUtils,function testJsonSplitMerge,Yes +gateway.tests.functional.test12_json_split_merge,modules.shared.jsonUtils,function normalizeJson,Yes +gateway.tests.functional.test12_json_split_merge,os,header,Yes +gateway.tests.functional.test12_json_split_merge,random,header,Yes +gateway.tests.functional.test12_json_split_merge,random,function testJsonSplitMerge,Yes +gateway.tests.functional.test12_json_split_merge,sys,header,Yes +gateway.tests.functional.test12_json_split_merge,time,header,Yes +gateway.tests.functional.test12_json_split_merge,traceback,function runTest,Yes +gateway.tests.functional.test12_json_split_merge,traceback,function testAllJsonFiles,Yes +gateway.tests.functional.test12_json_split_merge,typing,header,Yes +gateway.tests.functional.test13_json_completion_cuts,asyncio,header,Yes +gateway.tests.functional.test13_json_completion_cuts,json,header,Yes +gateway.tests.functional.test13_json_completion_cuts,modules.shared.jsonContinuation,header,Yes +gateway.tests.functional.test13_json_completion_cuts,os,header,Yes +gateway.tests.functional.test13_json_completion_cuts,sys,header,Yes +gateway.tests.functional.test13_json_completion_cuts,traceback,function runTest,Yes +gateway.tests.functional.test13_json_completion_cuts,typing,header,Yes +gateway.tests.functional.test14_json_continuation_context,asyncio,header,Yes +gateway.tests.functional.test14_json_continuation_context,json,header,Yes +gateway.tests.functional.test14_json_continuation_context,modules.shared.jsonContinuation,header,Yes +gateway.tests.functional.test14_json_continuation_context,os,header,Yes +gateway.tests.functional.test14_json_continuation_context,sys,header,Yes +gateway.tests.functional.test14_json_continuation_context,traceback,function testSpecificCutJson,Yes +gateway.tests.functional.test14_json_continuation_context,traceback,function runTest,Yes +gateway.tests.functional.test14_json_continuation_context,typing,header,Yes +gateway.tests.functional.test_kpi_full,json,header,Yes +gateway.tests.functional.test_kpi_full,modules.datamodels.datamodelAi,header,Yes +gateway.tests.functional.test_kpi_full,modules.features.aichat.serviceAi.subJsonResponseHandling,header,Yes +gateway.tests.functional.test_kpi_full,modules.shared.jsonUtils,header,Yes +gateway.tests.functional.test_kpi_full,os,header,Yes +gateway.tests.functional.test_kpi_full,pytest,header,Yes +gateway.tests.functional.test_kpi_full,sys,header,Yes +gateway.tests.functional.test_kpi_incomplete,json,header,Yes +gateway.tests.functional.test_kpi_incomplete,modules.datamodels.datamodelAi,header,Yes +gateway.tests.functional.test_kpi_incomplete,modules.features.aichat.serviceAi.subJsonResponseHandling,header,Yes +gateway.tests.functional.test_kpi_incomplete,modules.shared.jsonUtils,header,Yes +gateway.tests.functional.test_kpi_incomplete,os,header,Yes +gateway.tests.functional.test_kpi_incomplete,pytest,header,Yes +gateway.tests.functional.test_kpi_incomplete,sys,header,Yes +gateway.tests.functional.test_kpi_incomplete,traceback,header,Yes +gateway.tests.functional.test_kpi_path,json,header,Yes +gateway.tests.functional.test_kpi_path,modules.features.aichat.serviceAi.subJsonResponseHandling,header,Yes +gateway.tests.functional.test_kpi_path,os,header,Yes +gateway.tests.functional.test_kpi_path,sys,header,Yes +gateway.tests.functional.test_kpi_path,traceback,header,Yes +gateway.tests.integration.options.test_options_api,app,function app,Yes +gateway.tests.integration.options.test_options_api,fastapi.testclient,header,Yes +gateway.tests.integration.options.test_options_api,modules.datamodels.datamodelUam,header,Yes +gateway.tests.integration.options.test_options_api,modules.interfaces.interfaceDbApp,header,Yes +gateway.tests.integration.options.test_options_api,pytest,header,Yes +gateway.tests.integration.options.test_options_api,secrets,header,Yes +gateway.tests.integration.rbac.test_rbac_database,modules.connectors.connectorDbPostgre,header,Yes +gateway.tests.integration.rbac.test_rbac_database,modules.datamodels.datamodelUam,header,Yes +gateway.tests.integration.rbac.test_rbac_database,modules.datamodels.datamodelUam,function testBuildRbacWhereClauseUserConnectionTable,Yes +gateway.tests.integration.rbac.test_rbac_database,modules.shared.configuration,header,Yes +gateway.tests.integration.rbac.test_rbac_database,pytest,header,Yes +gateway.tests.integration.workflows.test_workflow_execution,modules.datamodels.datamodelDocref,header,Yes +gateway.tests.integration.workflows.test_workflow_execution,modules.datamodels.datamodelWorkflow,header,Yes +gateway.tests.integration.workflows.test_workflow_execution,modules.datamodels.datamodelWorkflow,function test_extractContentParameters_structure,Yes +gateway.tests.integration.workflows.test_workflow_execution,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.integration.workflows.test_workflow_execution,modules.shared.jsonUtils,function test_parseJsonWithModel_with_code_fences,Yes +gateway.tests.integration.workflows.test_workflow_execution,modules.shared.jsonUtils,function test_parseJsonWithModel_with_extra_text,Yes +gateway.tests.integration.workflows.test_workflow_execution,pytest,header,Yes +gateway.tests.integration.workflows.test_workflow_execution,unittest.mock,header,Yes +gateway.tests.integration.workflows.test_workflow_execution,uuid,header,Yes +gateway.tests.unit.datamodels.test_docref,modules.datamodels.datamodelDocref,header,Yes +gateway.tests.unit.datamodels.test_docref,pytest,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,json,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,modules.datamodels.datamodelAi,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,modules.datamodels.datamodelDocref,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,modules.datamodels.datamodelExtraction,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,modules.datamodels.datamodelWorkflow,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,pytest,header,Yes +gateway.tests.unit.datamodels.test_workflow_models,typing,header,Yes +gateway.tests.unit.options.test_frontend_options_types,modules.shared.frontendOptionsTypes,header,Yes +gateway.tests.unit.options.test_frontend_options_types,pytest,header,Yes +gateway.tests.unit.options.test_main_options,modules.datamodels.datamodelUam,header,Yes +gateway.tests.unit.options.test_main_options,modules.features.dynamicOptions.mainDynamicOptions,header,Yes +gateway.tests.unit.options.test_main_options,pytest,header,Yes +gateway.tests.unit.options.test_main_options,unittest.mock,header,Yes +gateway.tests.unit.rbac.test_rbac_bootstrap,modules.datamodels.datamodelRbac,header,Yes +gateway.tests.unit.rbac.test_rbac_bootstrap,modules.datamodels.datamodelUam,header,Yes +gateway.tests.unit.rbac.test_rbac_bootstrap,modules.datamodels.datamodelUam,header,Yes +gateway.tests.unit.rbac.test_rbac_bootstrap,modules.interfaces.interfaceBootstrap,header,Yes +gateway.tests.unit.rbac.test_rbac_bootstrap,pytest,header,Yes +gateway.tests.unit.rbac.test_rbac_bootstrap,unittest.mock,header,Yes +gateway.tests.unit.rbac.test_rbac_permissions,modules.connectors.connectorDbPostgre,header,Yes +gateway.tests.unit.rbac.test_rbac_permissions,modules.datamodels.datamodelRbac,header,Yes +gateway.tests.unit.rbac.test_rbac_permissions,modules.datamodels.datamodelUam,header,Yes +gateway.tests.unit.rbac.test_rbac_permissions,modules.security.rbac,header,Yes +gateway.tests.unit.rbac.test_rbac_permissions,pytest,header,Yes +gateway.tests.unit.rbac.test_rbac_permissions,unittest.mock,header,Yes +gateway.tests.unit.services.test_json_extraction_merging,json,header,Yes +gateway.tests.unit.services.test_json_extraction_merging,modules.datamodels.datamodelExtraction,header,Yes +gateway.tests.unit.services.test_json_extraction_merging,modules.features.aichat.serviceExtraction.mainServiceExtraction,header,Yes +gateway.tests.unit.services.test_json_extraction_merging,os,header,Yes +gateway.tests.unit.services.test_json_extraction_merging,sys,header,Yes +gateway.tests.unit.services.test_json_extraction_merging,traceback,function main,Yes +gateway.tests.unit.utils.test_json_utils,json,header,Yes +gateway.tests.unit.utils.test_json_utils,modules.datamodels.datamodelWorkflow,header,Yes +gateway.tests.unit.utils.test_json_utils,modules.shared.jsonUtils,header,Yes +gateway.tests.unit.utils.test_json_utils,pytest,header,Yes +gateway.tests.unit.workflows.test_state_management,modules.datamodels.datamodelWorkflow,header,Yes +gateway.tests.unit.workflows.test_state_management,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.unit.workflows.test_state_management,pytest,header,Yes +gateway.tests.unit.workflows.test_state_management,uuid,header,Yes +gateway.tests.validation.test_architecture_validation,modules.datamodels.datamodelDocref,header,Yes +gateway.tests.validation.test_architecture_validation,modules.datamodels.datamodelWorkflow,header,Yes +gateway.tests.validation.test_architecture_validation,modules.features.aichat.datamodelFeatureAiChat,header,Yes +gateway.tests.validation.test_architecture_validation,modules.shared.jsonUtils,header,Yes +gateway.tests.validation.test_architecture_validation,os,header,Yes +gateway.tests.validation.test_architecture_validation,pytest,header,Yes +gateway.tests.validation.test_architecture_validation,sys,header,Yes diff --git a/scripts/script_analyze_imports.py b/scripts/script_analyze_imports.py new file mode 100644 index 00000000..b6bf9632 --- /dev/null +++ b/scripts/script_analyze_imports.py @@ -0,0 +1,196 @@ +# Copyright (c) 2025 Patrick Motsch +# All rights reserved. +""" +Analyze all imports in the gateway codebase and generate a CSV report. +Helps identify which imports need to be cleaned up after refactoring. +""" + +import os +import ast +import csv +import sys +from pathlib import Path +from typing import List, Tuple, Optional + +# Gateway root directory +GATEWAY_ROOT = Path(__file__).parent.parent +OUTPUT_FILE = GATEWAY_ROOT / "scripts" / "import_analysis.csv" + + +def getModuleName(filePath: Path) -> str: + """Convert file path to module name format.""" + relPath = filePath.relative_to(GATEWAY_ROOT.parent) + # Remove .py extension and convert to module format + modulePath = str(relPath).replace(os.sep, ".").replace("/", ".") + if modulePath.endswith(".py"): + modulePath = modulePath[:-3] + return modulePath + + +def getImportedModuleName(importNode: ast.AST) -> List[str]: + """Extract imported module names from import node.""" + modules = [] + + if isinstance(importNode, ast.Import): + for alias in importNode.names: + modules.append(alias.name) + elif isinstance(importNode, ast.ImportFrom): + if importNode.module: + # For relative imports, we'll mark them specially + if importNode.level > 0: + modules.append(f"{'.' * importNode.level}{importNode.module or ''}") + else: + modules.append(importNode.module) + elif importNode.level > 0: + # Pure relative import like "from . import x" + modules.append("." * importNode.level) + + return modules + + +def findEnclosingFunction(node: ast.AST, tree: ast.Module) -> Optional[str]: + """Find the function name that contains this import, if any.""" + for item in ast.walk(tree): + if isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)): + for child in ast.walk(item): + if child is node: + return item.name + return None + + +def checkModuleExists(moduleName: str, currentFile: Path) -> bool: + """Check if an imported module exists.""" + if moduleName.startswith("."): + # Relative import - check relative to current file's directory + currentDir = currentFile.parent + relativePath = moduleName.lstrip(".") + + if not relativePath: + return True # "from . import x" - current package + + # Convert module path to file path + parts = relativePath.split(".") + checkPath = currentDir + for part in parts: + checkPath = checkPath / part + + # Check if it's a package or module + if checkPath.is_dir() and (checkPath / "__init__.py").exists(): + return True + if (checkPath.parent / f"{checkPath.name}.py").exists(): + return True + if checkPath.with_suffix(".py").exists(): + return True + + return False + + # Absolute import + if moduleName.startswith("modules."): + # Internal module - check in gateway + parts = moduleName.split(".") + checkPath = GATEWAY_ROOT + for part in parts: + checkPath = checkPath / part + + # Check if it's a package or module + if checkPath.is_dir() and (checkPath / "__init__.py").exists(): + return True + if checkPath.with_suffix(".py").exists(): + return True + + return False + + # External module - assume it exists (can't easily verify without importing) + return True + + +def analyzeFile(filePath: Path) -> List[Tuple[str, str, str, str]]: + """Analyze imports in a single file.""" + results = [] + moduleName = getModuleName(filePath) + + try: + with open(filePath, "r", encoding="utf-8") as f: + content = f.read() + + tree = ast.parse(content, filename=str(filePath)) + except (SyntaxError, UnicodeDecodeError) as e: + print(f"Error parsing {filePath}: {e}") + return results + + # Find all imports and their positions + for node in ast.walk(tree): + if isinstance(node, (ast.Import, ast.ImportFrom)): + importedModules = getImportedModuleName(node) + + # Determine position + position = "header" + + # Check if import is inside a function by examining parent nodes + # We need to traverse the tree structure + for item in ast.walk(tree): + if isinstance(item, (ast.FunctionDef, ast.AsyncFunctionDef)): + # Check if this import node is within the function's body + for bodyNode in ast.walk(item): + if bodyNode is node: + position = f"function {item.name}" + break + if position != "header": + break + + for importedModule in importedModules: + # Check if module exists + exists = checkModuleExists(importedModule, filePath) + validStr = "Yes" if exists else "No" + + # Format imported module name + if importedModule.startswith("."): + # Make relative import absolute for clarity + importedModuleDisplay = f"(relative) {importedModule}" + else: + importedModuleDisplay = importedModule + + results.append((moduleName, importedModuleDisplay, position, validStr)) + + return results + + +def main(): + """Main function to analyze all imports.""" + allResults = [] + + # Find all Python files in gateway + for root, dirs, files in os.walk(GATEWAY_ROOT): + # Skip __pycache__ directories + dirs[:] = [d for d in dirs if d != "__pycache__"] + + for file in files: + if file.endswith(".py"): + filePath = Path(root) / file + results = analyzeFile(filePath) + allResults.extend(results) + + # Sort results + allResults.sort(key=lambda x: (x[0], x[1])) + + # Write CSV + with open(OUTPUT_FILE, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f) + writer.writerow(["module_name", "imported_module_name", "position", "import_valid"]) + writer.writerows(allResults) + + print(f"Analysis complete. Found {len(allResults)} imports.") + print(f"Output written to: {OUTPUT_FILE}") + + # Print summary of invalid imports + invalidImports = [r for r in allResults if r[3] == "No"] + if invalidImports: + print(f"\nFound {len(invalidImports)} potentially invalid imports:") + for moduleName, importedModule, position, _ in invalidImports[:20]: + print(f" {moduleName} -> {importedModule} ({position})") + if len(invalidImports) > 20: + print(f" ... and {len(invalidImports) - 20} more") + + +if __name__ == "__main__": + main() diff --git a/tests/functional/test01_ai_model_selection.py b/tests/functional/test01_ai_model_selection.py index b06e9c64..0cf36f47 100644 --- a/tests/functional/test01_ai_model_selection.py +++ b/tests/functional/test01_ai_model_selection.py @@ -29,8 +29,8 @@ from modules.datamodels.datamodelAi import ( ProcessingModeEnum, ) from modules.datamodels.datamodelUam import User -from modules.aicore.aicoreModelRegistry import modelRegistry -from modules.aicore.aicoreModelSelector import modelSelector +from modules.features.aichat.aicore.aicoreModelRegistry import modelRegistry +from modules.features.aichat.aicore.aicoreModelSelector import modelSelector class ModelSelectionTester: @@ -46,7 +46,7 @@ class ModelSelectionTester: self.services = getServices(testUser, None) async def initialize(self) -> None: - from modules.services.serviceAi.mainServiceAi import AiService + from modules.features.aichat.serviceAi.mainServiceAi import AiService from modules.interfaces.interfaceAiObjects import AiObjects self.services.ai = await AiService.create(self.services) diff --git a/tests/functional/test02_ai_models.py b/tests/functional/test02_ai_models.py index 12a374f8..00953f3e 100644 --- a/tests/functional/test02_ai_models.py +++ b/tests/functional/test02_ai_models.py @@ -68,24 +68,24 @@ class AIModelsTester: logging.getLogger().setLevel(logging.DEBUG) # Initialize the model registry with all connectors - from modules.aicore.aicoreModelRegistry import modelRegistry - from modules.aicore.aicorePluginTavily import AiTavily - from modules.aicore.aicorePluginPerplexity import AiPerplexity + from modules.features.aichat.aicore.aicoreModelRegistry import modelRegistry + from modules.features.aichat.aicore.aicorePluginTavily import AiTavily + from modules.features.aichat.aicore.aicorePluginPerplexity import AiPerplexity # Note: We don't need to register web connectors for IMAGE_ANALYSE testing # modelRegistry.registerConnector(AiTavily()) # modelRegistry.registerConnector(AiPerplexity()) # The AI service needs to be recreated with proper initialization - from modules.services.serviceAi.mainServiceAi import AiService + from modules.features.aichat.serviceAi.mainServiceAi import AiService self.services.ai = await AiService.create(self.services) # Also initialize extraction service for image processing - from modules.services.serviceExtraction.mainServiceExtraction import ExtractionService + from modules.features.aichat.serviceExtraction.mainServiceExtraction import ExtractionService self.services.extraction = ExtractionService(self.services) # Create a minimal workflow context - from modules.datamodels.datamodelChat import ChatWorkflow, WorkflowModeEnum + from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, WorkflowModeEnum import uuid self.services.currentWorkflow = ChatWorkflow( @@ -311,7 +311,7 @@ class AIModelsTester: print(f"{'='*60}") # Get model from registry - from modules.aicore.aicoreModelRegistry import modelRegistry + from modules.features.aichat.aicore.aicoreModelRegistry import modelRegistry model = modelRegistry.getModel(modelName) if not model: @@ -693,7 +693,7 @@ Width: {crawlWidth} def getAllAvailableModels(self) -> List[Dict[str, Any]]: """Get all available models with their supported operation types.""" - from modules.aicore.aicoreModelRegistry import modelRegistry + from modules.features.aichat.aicore.aicoreModelRegistry import modelRegistry from modules.datamodels.datamodelAi import OperationTypeEnum # Get all models from registry diff --git a/tests/functional/test03_ai_operations.py b/tests/functional/test03_ai_operations.py index f807fe24..5875c2bb 100644 --- a/tests/functional/test03_ai_operations.py +++ b/tests/functional/test03_ai_operations.py @@ -18,7 +18,7 @@ if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) from modules.datamodels.datamodelAi import OperationTypeEnum -from modules.datamodels.datamodelChat import ChatWorkflow, ChatDocument, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, ChatDocument, WorkflowModeEnum from modules.datamodels.datamodelUam import User @@ -94,7 +94,7 @@ class MethodAiOperationsTester: logging.getLogger().setLevel(logging.DEBUG) # Import and initialize services - use the same approach as routeChatPlayground - import modules.interfaces.interfaceDbChat as interfaceDbChat + import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat interfaceDbChat = interfaceDbChat.getInterface(self.testUser) # Import and initialize services @@ -174,7 +174,7 @@ class MethodAiOperationsTester: imageData = f.read() # Create a ChatDocument - from modules.datamodels.datamodelChat import ChatDocument + from modules.features.aichat.datamodelFeatureAiChat import ChatDocument import uuid testImageDoc = ChatDocument( @@ -186,7 +186,7 @@ class MethodAiOperationsTester: ) # Create a message with this document - from modules.datamodels.datamodelChat import ChatMessage + from modules.features.aichat.datamodelFeatureAiChat import ChatMessage import time testMessage = ChatMessage( @@ -201,7 +201,7 @@ class MethodAiOperationsTester: # Save message to database if self.services.workflow: - import modules.interfaces.interfaceDbChat as interfaceDbChat + import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat interfaceDbChat = interfaceDbChat.getInterface(self.testUser) messageDict = testMessage.model_dump() interfaceDbChat.createMessage(messageDict) @@ -283,7 +283,7 @@ class MethodAiOperationsTester: maxSteps=5 ) # Save workflow to database - import modules.interfaces.interfaceDbChat as interfaceDbChat + import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat interfaceDbChat = interfaceDbChat.getInterface(self.testUser) workflowDict = testWorkflow.model_dump() interfaceDbChat.createWorkflow(workflowDict) diff --git a/tests/functional/test04_ai_behavior.py b/tests/functional/test04_ai_behavior.py index 3e46bc0c..6b28439a 100644 --- a/tests/functional/test04_ai_behavior.py +++ b/tests/functional/test04_ai_behavior.py @@ -42,10 +42,10 @@ class AIBehaviorTester: logging.getLogger().setLevel(logging.DEBUG) # Create and save workflow in database using the interface - from modules.datamodels.datamodelChat import ChatWorkflow, WorkflowModeEnum + from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, WorkflowModeEnum import uuid import time - import modules.interfaces.interfaceDbChat as interfaceDbChat + import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat currentTimestamp = time.time() diff --git a/tests/functional/test05_workflow_with_documents.py b/tests/functional/test05_workflow_with_documents.py index 8850ae2b..7e6347c2 100644 --- a/tests/functional/test05_workflow_with_documents.py +++ b/tests/functional/test05_workflow_with_documents.py @@ -20,10 +20,10 @@ if _gateway_path not in sys.path: # Import the service initialization from modules.services import getInterface as getServices -from modules.datamodels.datamodelChat import UserInputRequest, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import UserInputRequest, WorkflowModeEnum from modules.datamodels.datamodelUam import User -from modules.features.workflow import chatStart -import modules.interfaces.interfaceDbChat as interfaceDbChat +from modules.workflows.automation import chatStart +import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat class WorkflowWithDocumentsTester: diff --git a/tests/functional/test06_workflow_prompt_variations.py b/tests/functional/test06_workflow_prompt_variations.py index 106e2999..ada63dea 100644 --- a/tests/functional/test06_workflow_prompt_variations.py +++ b/tests/functional/test06_workflow_prompt_variations.py @@ -22,10 +22,10 @@ if _gateway_path not in sys.path: # Import the service initialization from modules.services import getInterface as getServices -from modules.datamodels.datamodelChat import UserInputRequest, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import UserInputRequest, WorkflowModeEnum from modules.datamodels.datamodelUam import User -from modules.features.workflow import chatStart -import modules.interfaces.interfaceDbChat as interfaceDbChat +from modules.workflows.automation import chatStart +import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat class WorkflowPromptVariationsTester: diff --git a/tests/functional/test07_json_merge.py b/tests/functional/test07_json_merge.py index de70052f..dec51a95 100644 --- a/tests/functional/test07_json_merge.py +++ b/tests/functional/test07_json_merge.py @@ -11,7 +11,7 @@ if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) # Import after path setup -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler # type: ignore +from modules.features.aichat.serviceAi.subJsonResponseHandling import JsonResponseHandler # type: ignore from modules.shared.jsonUtils import extractSectionsFromDocument # type: ignore diff --git a/tests/functional/test08_json_finalization.py b/tests/functional/test08_json_finalization.py index a05daccc..a6ff570e 100644 --- a/tests/functional/test08_json_finalization.py +++ b/tests/functional/test08_json_finalization.py @@ -32,7 +32,7 @@ if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) # Import after path setup -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler # type: ignore +from modules.features.aichat.serviceAi.subJsonResponseHandling import JsonResponseHandler # type: ignore from modules.shared.jsonUtils import extractSectionsFromDocument, extractJsonString, repairBrokenJson # type: ignore diff --git a/tests/functional/test09_document_generation_formats.py b/tests/functional/test09_document_generation_formats.py index 3c85460e..9a42c04f 100644 --- a/tests/functional/test09_document_generation_formats.py +++ b/tests/functional/test09_document_generation_formats.py @@ -21,10 +21,10 @@ if _gateway_path not in sys.path: # Import the service initialization from modules.services import getInterface as getServices -from modules.datamodels.datamodelChat import UserInputRequest, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import UserInputRequest, WorkflowModeEnum from modules.datamodels.datamodelUam import User -from modules.features.workflow import chatStart -import modules.interfaces.interfaceDbChat as interfaceDbChat +from modules.workflows.automation import chatStart +import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat class DocumentGenerationFormatsTester: diff --git a/tests/functional/test10_document_generation_formats.py b/tests/functional/test10_document_generation_formats.py index 19bdb12f..1ef6b678 100644 --- a/tests/functional/test10_document_generation_formats.py +++ b/tests/functional/test10_document_generation_formats.py @@ -21,10 +21,10 @@ if _gateway_path not in sys.path: # Import the service initialization from modules.services import getInterface as getServices -from modules.datamodels.datamodelChat import UserInputRequest, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import UserInputRequest, WorkflowModeEnum from modules.datamodels.datamodelUam import User -from modules.features.workflow import chatStart -import modules.interfaces.interfaceDbChat as interfaceDbChat +from modules.workflows.automation import chatStart +import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat class DocumentGenerationFormatsTester10: diff --git a/tests/functional/test11_code_generation_formats.py b/tests/functional/test11_code_generation_formats.py index 64c8f93e..f443ff61 100644 --- a/tests/functional/test11_code_generation_formats.py +++ b/tests/functional/test11_code_generation_formats.py @@ -23,10 +23,10 @@ if _gateway_path not in sys.path: # Import the service initialization from modules.services import getInterface as getServices -from modules.datamodels.datamodelChat import UserInputRequest, WorkflowModeEnum +from modules.features.aichat.datamodelFeatureAiChat import UserInputRequest, WorkflowModeEnum from modules.datamodels.datamodelUam import User -from modules.features.workflow import chatStart -import modules.interfaces.interfaceDbChat as interfaceDbChat +from modules.workflows.automation import chatStart +import modules.features.aichat.interfaceFeatureAiChat as interfaceFeatureAiChat class CodeGenerationFormatsTester11: diff --git a/tests/functional/test12_json_split_merge.py b/tests/functional/test12_json_split_merge.py index 4dac56cb..2632ed2e 100644 --- a/tests/functional/test12_json_split_merge.py +++ b/tests/functional/test12_json_split_merge.py @@ -20,7 +20,7 @@ if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) # Import JSON merger from workflow tools -from modules.services.serviceAi.subJsonMerger import ModularJsonMerger, JsonMergeLogger +from modules.features.aichat.serviceAi.subJsonMerger import ModularJsonMerger, JsonMergeLogger from modules.shared.jsonContinuation import getContexts diff --git a/tests/functional/test_kpi_full.py b/tests/functional/test_kpi_full.py index 32e40f07..4457b3e3 100644 --- a/tests/functional/test_kpi_full.py +++ b/tests/functional/test_kpi_full.py @@ -11,7 +11,7 @@ _gateway_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ". if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler +from modules.features.aichat.serviceAi.subJsonResponseHandling import JsonResponseHandler from modules.datamodels.datamodelAi import JsonAccumulationState # Load actual JSON response diff --git a/tests/functional/test_kpi_incomplete.py b/tests/functional/test_kpi_incomplete.py index f6e60aa0..90cdcdcb 100644 --- a/tests/functional/test_kpi_incomplete.py +++ b/tests/functional/test_kpi_incomplete.py @@ -11,7 +11,7 @@ _gateway_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ". if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler +from modules.features.aichat.serviceAi.subJsonResponseHandling import JsonResponseHandler from modules.datamodels.datamodelAi import JsonAccumulationState from modules.shared.jsonUtils import extractJsonString, repairBrokenJson diff --git a/tests/functional/test_kpi_path.py b/tests/functional/test_kpi_path.py index 0c54e3c2..66e7293b 100644 --- a/tests/functional/test_kpi_path.py +++ b/tests/functional/test_kpi_path.py @@ -10,7 +10,7 @@ _gateway_path = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", ". if _gateway_path not in sys.path: sys.path.insert(0, _gateway_path) -from modules.services.serviceAi.subJsonResponseHandling import JsonResponseHandler +from modules.features.aichat.serviceAi.subJsonResponseHandling import JsonResponseHandler # Test JSON matching the actual response test_json = { diff --git a/tests/integration/workflows/test_workflow_execution.py b/tests/integration/workflows/test_workflow_execution.py index a2b69576..26552008 100644 --- a/tests/integration/workflows/test_workflow_execution.py +++ b/tests/integration/workflows/test_workflow_execution.py @@ -10,7 +10,7 @@ import pytest import uuid from unittest.mock import Mock, AsyncMock, patch -from modules.datamodels.datamodelChat import ChatWorkflow, TaskContext, TaskStep +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, TaskContext, TaskStep from modules.datamodels.datamodelWorkflow import ActionDefinition from modules.datamodels.datamodelDocref import DocumentReferenceList, DocumentListReference, DocumentItemReference diff --git a/tests/unit/options/test_frontend_options_types.py b/tests/unit/options/test_frontend_options_types.py deleted file mode 100644 index fbb7ed75..00000000 --- a/tests/unit/options/test_frontend_options_types.py +++ /dev/null @@ -1,117 +0,0 @@ -# Copyright (c) 2025 Patrick Motsch -# All rights reserved. -""" -Unit tests for frontend_options type system and utilities. -Tests type validation, format detection, and utility functions. -""" - -import pytest -from modules.shared.frontendOptionsTypes import ( - FrontendOptions, - OptionItem, - isStringReference, - isStaticList, - validateFrontendOptions, - getOptionsName, - getStaticOptions -) - - -class TestFrontendOptionsTypes: - """Test frontend_options type system.""" - - def testIsStringReference(self): - """Test string reference detection.""" - assert isStringReference("user.role") is True - assert isStringReference("auth.authority") is True - assert isStringReference("") is True # Empty string is still a string - - assert isStringReference([]) is False - assert isStringReference([{"value": "a"}]) is False - assert isStringReference(None) is False - - def testIsStaticList(self): - """Test static list detection.""" - assert isStaticList([]) is True - assert isStaticList([{"value": "a", "label": {"en": "A"}}]) is True - - assert isStaticList("user.role") is False - assert isStaticList(None) is False - - def testValidateFrontendOptionsString(self): - """Test validation of string references.""" - assert validateFrontendOptions("user.role") is True - assert validateFrontendOptions("auth.authority") is True - assert validateFrontendOptions("") is False # Empty string is invalid - assert validateFrontendOptions(" ") is False # Whitespace-only is invalid - - def testValidateFrontendOptionsStaticList(self): - """Test validation of static lists.""" - # Valid static list - validList = [ - {"value": "a", "label": {"en": "All", "fr": "Tous"}}, - {"value": "m", "label": {"en": "My", "fr": "Mes"}} - ] - assert validateFrontendOptions(validList) is True - - # Empty list is valid - assert validateFrontendOptions([]) is True - - # Missing value key - invalidList1 = [{"label": {"en": "Test"}}] - assert validateFrontendOptions(invalidList1) is False - - # Missing label key - invalidList2 = [{"value": "a"}] - assert validateFrontendOptions(invalidList2) is False - - # Label is not a dict - invalidList3 = [{"value": "a", "label": "not a dict"}] - assert validateFrontendOptions(invalidList3) is False - - # Not a list or string - assert validateFrontendOptions(None) is False - assert validateFrontendOptions(123) is False - assert validateFrontendOptions({}) is False - - def testGetOptionsName(self): - """Test getting options name from string reference.""" - assert getOptionsName("user.role") == "user.role" - assert getOptionsName("auth.authority") == "auth.authority" - - # Should raise ValueError for non-string - with pytest.raises(ValueError): - getOptionsName([]) - - with pytest.raises(ValueError): - getOptionsName(None) - - def testGetStaticOptions(self): - """Test getting static options list.""" - options = [ - {"value": "a", "label": {"en": "All"}}, - {"value": "m", "label": {"en": "My"}} - ] - assert getStaticOptions(options) == options - - # Should raise ValueError for non-list - with pytest.raises(ValueError): - getStaticOptions("user.role") - - with pytest.raises(ValueError): - getStaticOptions(None) - - def testTypeAliases(self): - """Test that type aliases are properly defined.""" - # FrontendOptions should accept both str and List[OptionItem] - stringRef: FrontendOptions = "user.role" - staticList: FrontendOptions = [{"value": "a", "label": {"en": "A"}}] - - assert isinstance(stringRef, str) - assert isinstance(staticList, list) - - # OptionItem should be Dict[str, Any] - optionItem: OptionItem = {"value": "test", "label": {"en": "Test"}} - assert isinstance(optionItem, dict) - assert "value" in optionItem - assert "label" in optionItem diff --git a/tests/unit/options/test_main_options.py b/tests/unit/options/test_main_options.py deleted file mode 100644 index 1182fb9c..00000000 --- a/tests/unit/options/test_main_options.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (c) 2025 Patrick Motsch -# All rights reserved. -""" -Unit tests for Dynamic Options API (mainDynamicOptions.py). -Tests option retrieval, validation, and context-aware options. -""" - -import pytest -from unittest.mock import Mock, patch -from modules.features.dynamicOptions.mainDynamicOptions import ( - getOptions, - getAvailableOptionsNames, - STANDARD_ROLES, - AUTH_AUTHORITY_OPTIONS, - CONNECTION_STATUS_OPTIONS -) -from modules.datamodels.datamodelUam import User, UserConnection, AuthAuthority - - -class TestMainOptions: - """Test Options API functionality.""" - - def testGetOptionsUserRole(self): - """Test getting user role options.""" - options = getOptions("user.role") - - assert isinstance(options, list) - assert len(options) == 4 # sysadmin, admin, user, viewer - - # Check structure - for option in options: - assert "value" in option - assert "label" in option - assert isinstance(option["label"], dict) - assert "en" in option["label"] - assert "fr" in option["label"] - - # Check specific values - values = [opt["value"] for opt in options] - assert "sysadmin" in values - assert "admin" in values - assert "user" in values - assert "viewer" in values - - def testGetOptionsAuthAuthority(self): - """Test getting auth authority options.""" - options = getOptions("auth.authority") - - assert isinstance(options, list) - assert len(options) == 3 # local, google, msft - - # Check structure - for option in options: - assert "value" in option - assert "label" in option - - # Check specific values - values = [opt["value"] for opt in options] - assert "local" in values - assert "google" in values - assert "msft" in values - - def testGetOptionsConnectionStatus(self): - """Test getting connection status options.""" - options = getOptions("connection.status") - - assert isinstance(options, list) - assert len(options) == 5 # active, expired, revoked, pending, error - - # Check structure - for option in options: - assert "value" in option - assert "label" in option - - # Check specific values - values = [opt["value"] for opt in options] - assert "active" in values - assert "expired" in values - assert "revoked" in values - assert "pending" in values - assert "error" in values - - def testGetOptionsUserConnection(self): - """Test getting user connection options (context-aware).""" - # Without currentUser, should return empty list - options = getOptions("user.connection") - assert options == [] - - # With currentUser but no connections - user = User( - id="user1", - username="testuser", - roleLabels=["user"], - mandateId="mandate1" - ) - - with patch('modules.features.dynamicOptions.mainDynamicOptions.getInterface') as mockGetInterface: - mockInterface = Mock() - mockInterface.getUserConnections.return_value = [] - mockGetInterface.return_value = mockInterface - - options = getOptions("user.connection", currentUser=user) - assert options == [] - - def testGetOptionsUserConnectionWithData(self): - """Test getting user connection options with actual connections.""" - user = User( - id="user1", - username="testuser", - roleLabels=["user"], - mandateId="mandate1" - ) - - # Mock connections - mockConn1 = Mock(spec=UserConnection) - mockConn1.id = "conn1" - mockConn1.authority = AuthAuthority.GOOGLE - mockConn1.externalUsername = "user@example.com" - mockConn1.externalId = None - - mockConn2 = Mock(spec=UserConnection) - mockConn2.id = "conn2" - mockConn2.authority = AuthAuthority.MSFT - mockConn2.externalUsername = None - mockConn2.externalId = "external-id-123" - - with patch('modules.features.dynamicOptions.mainDynamicOptions.getInterface') as mockGetInterface: - mockInterface = Mock() - mockInterface.getUserConnections.return_value = [mockConn1, mockConn2] - mockGetInterface.return_value = mockInterface - - options = getOptions("user.connection", currentUser=user) - - assert len(options) == 2 - assert options[0]["value"] == "conn1" - assert options[1]["value"] == "conn2" - - # Check labels contain authority and username/id - assert "google" in options[0]["label"]["en"].lower() - assert "user@example.com" in options[0]["label"]["en"] - - def testGetOptionsCaseInsensitive(self): - """Test that options name matching is case-insensitive.""" - options1 = getOptions("user.role") - options2 = getOptions("USER.ROLE") - options3 = getOptions("User.Role") - - assert options1 == options2 == options3 - - def testGetOptionsUnknown(self): - """Test that unknown options name raises ValueError.""" - with pytest.raises(ValueError, match="Unknown options name"): - getOptions("unknown.options") - - def testGetAvailableOptionsNames(self): - """Test getting list of available options names.""" - names = getAvailableOptionsNames() - - assert isinstance(names, list) - assert "user.role" in names - assert "auth.authority" in names - assert "connection.status" in names - assert "user.connection" in names - assert len(names) == 4 - - def testStandardRolesConstant(self): - """Test that STANDARD_ROLES constant is properly defined.""" - assert isinstance(STANDARD_ROLES, list) - assert len(STANDARD_ROLES) == 4 - - for role in STANDARD_ROLES: - assert "value" in role - assert "label" in role - - def testAuthAuthorityOptionsConstant(self): - """Test that AUTH_AUTHORITY_OPTIONS constant is properly defined.""" - assert isinstance(AUTH_AUTHORITY_OPTIONS, list) - assert len(AUTH_AUTHORITY_OPTIONS) == 3 - - def testConnectionStatusOptionsConstant(self): - """Test that CONNECTION_STATUS_OPTIONS constant is properly defined.""" - assert isinstance(CONNECTION_STATUS_OPTIONS, list) - assert len(CONNECTION_STATUS_OPTIONS) == 5 # active, expired, revoked, pending, error diff --git a/tests/unit/services/test_json_extraction_merging.py b/tests/unit/services/test_json_extraction_merging.py index 07ecfa4b..644b7140 100644 --- a/tests/unit/services/test_json_extraction_merging.py +++ b/tests/unit/services/test_json_extraction_merging.py @@ -14,7 +14,7 @@ import os sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../..')) from modules.datamodels.datamodelExtraction import ContentPart -from modules.services.serviceExtraction.mainServiceExtraction import ExtractionService +from modules.features.aichat.serviceExtraction.mainServiceExtraction import ExtractionService def test_detects_json_with_code_fences(): diff --git a/tests/unit/workflows/test_state_management.py b/tests/unit/workflows/test_state_management.py index ae502397..d649826e 100644 --- a/tests/unit/workflows/test_state_management.py +++ b/tests/unit/workflows/test_state_management.py @@ -9,7 +9,7 @@ Tests state increment methods, helper methods, and updateFromSelection. import pytest import uuid -from modules.datamodels.datamodelChat import ChatWorkflow, TaskContext, TaskStep +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow, TaskContext, TaskStep from modules.datamodels.datamodelWorkflow import ActionDefinition diff --git a/tests/validation/test_architecture_validation.py b/tests/validation/test_architecture_validation.py index 09f6e92c..dfc46be1 100644 --- a/tests/validation/test_architecture_validation.py +++ b/tests/validation/test_architecture_validation.py @@ -15,7 +15,7 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) from modules.datamodels.datamodelWorkflow import ActionDefinition, AiResponse from modules.datamodels.datamodelDocref import DocumentReferenceList, DocumentListReference -from modules.datamodels.datamodelChat import ChatWorkflow +from modules.features.aichat.datamodelFeatureAiChat import ChatWorkflow from modules.shared.jsonUtils import parseJsonWithModel