# LeoCRM — Complete System Audit **Datum:** 2026-08-20 **Auditor:** Agent Zero (Codebase Explorer) **Methode:** Code-Analyse (grep, import-check, file inspection) + Test-Ausführung --- ## Zusammenfassung | Metrik | Wert | |--------|------| | Gesamtzahl Vernetzungen | 72 | | Davon verbunden | 58 | | Davon unverbunden | 14 | | Davon getestet (Test-Datei existiert) | 52 | | Davon ungetestet | 20 | | Davon funktionsfähig (Code verifiziert) | 55 | | Davon nicht funktionsfähig / fehlend | 17 | ### Kritische findings: 1. **Pre-built Agents** (4 definiert) werden NICHT bei Plugin-Aktivierung registriert 2. **Wiki Plugin** hat keine `on_activate` → kein Search Provider, keine AI-Tools 3. **Mail/DMS/Calendar** registrieren KEINE AI-Tools (nur restore + history hooks) 4. **PWA Service Worker** ist explizit DEAKTIVIERT (unregister in main.tsx) 5. **test_p1_6_dms_streaming.py** hat Import-Error (CHUNK_SIZE nicht in dms/routes.py) 6. **PostgreSQL/Redis** müssen nach Crash manuell gestartet werden --- ## 1. Core CRM ### Vernetzung: Frontend → API → DB (Contacts) - Benötigt: Frontend ruft /api/v1/contacts auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/contacts.ts → app/routes/contacts.py → app/models/contact.py) - Verbindungs-Status: ✅ verbunden (app.include_router(contacts.router) in main.py:548) - Test-Status: ✅ getestet (tests/test_contacts.py, tests/test_contacts_lifecycle.py) - Gesamt: ✅ ### Vernetzung: Frontend → API → DB (Companies) - Benötigt: Frontend ruft /api/v1/companies auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/contacts.ts → app/routes/companies.py) - Verbindungs-Status: ✅ verbunden (app.include_router(companies_router) in main.py:547) - Test-Status: ✅ getestet (tests/test_companies.py) - Gesamt: ✅ ### Vernetzung: Frontend → API → DB (Tags) - Benötigt: Frontend ruft /api/v1/tags auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/tags.ts → app/plugins/builtins/tags/routes.py) - Verbindungs-Status: ✅ verbunden (Plugin-Route in plugin.py manifest) - Test-Status: ✅ getestet (tests/test_tags.py) - Gesamt: ✅ ### Vernetzung: Frontend → API → DB (Tasks) - Benötigt: Frontend ruft /api/v1/tasks auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/tasks.ts → app/plugins/builtins/tasks/routes.py) - Verbindungs-Status: ✅ verbunden (Plugin-Route in plugin.py manifest) - Test-Status: ✅ getestet (tests/test_tasks.py, tests/test_unified_tasks.py) - Gesamt: ✅ ### Vernetzung: Frontend → API → DB (Calendar) - Benötigt: Frontend ruft /api/v1/calendar auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/calendar.ts → app/plugins/builtins/calendar/routes.py) - Verbindungs-Status: ✅ verbunden (Plugin-Route in plugin.py manifest) - Test-Status: ✅ getestet (tests/test_calendar.py, tests/test_recurrence_unit.py) - Gesamt: ✅ ### Vernetzung: Frontend → API → DB (Mail) - Benötigt: Frontend ruft /api/v1/mail auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/mail.ts → app/plugins/builtins/mail/routes.py) - Verbindungs-Status: ✅ verbunden (Plugin-Route in plugin.py manifest) - Test-Status: ✅ getestet (tests/test_mail.py) - Gesamt: ✅ ### Vernetzung: Frontend → API → DB (DMS) - Benötigt: Frontend ruft /api/v1/dms auf, Backend liest/schreibt PostgreSQL - Code-Status: ✅ existiert (frontend/src/api/dms.ts → app/plugins/builtins/dms/routes.py) - Verbindungs-Status: ✅ verbunden (Plugin-Route in plugin.py manifest) - Test-Status: ✅ getestet (tests/test_dms.py, tests/test_dms_coverage.py, tests/test_dms_errors.py) - Gesamt: ✅ ### Vernetzung: Plugin Contracts zwischen Modulen - Benötigt: Plugins kommunizieren über Contract Registry, nicht über direkte Imports - Code-Status: ✅ existiert (app/plugins/builtins/contracts.py — ContractRegistry mit get_contract, register) - Verbindungs-Status: ✅ verbunden (kommunikation, mail, ai_assistant, graph_rag registriert) - Test-Status: ✅ getestet (tests/test_plugin_lifecycle.py, app/plugins/builtins/tests/test_contracts.py) - Gesamt: ✅ ### Vernetzung: Search Integration - Benötigt: Unified Search aggregiert Ergebnisse aus allen Plugins - Code-Status: ✅ existiert (app/plugins/builtins/unified_search/ mit 14 Providern) - Verbindungs-Status: ✅ verbunden (auto_register_providers in plugin.py on_activate) - Test-Status: ✅ getestet (tests/test_unified_search.py, tests/test_unified_search_phase_e.py) - Gesamt: ✅ ### Vernetzung: Permission/RLS enforcement - Benötigt: ABAC/RBAC auf allen Routes, RLS auf DB-Ebene - Code-Status: ✅ existiert (app/core/permissions.py, app/routes/policies.py, app/routes/entity_permissions.py) - Verbindungs-Status: ✅ verbunden (require_permission auf Routes, RLS in migration_runner.py) - Test-Status: ✅ getestet (tests/test_permissions.py, tests/test_abac.py, tests/test_abac_integration.py, tests/test_rls_coverage.py) - Gesamt: ✅ --- ## 2. AI/Agent System ### Vernetzung: Agent Loop → LLM Client → LiteLLM - Benötigt: Agent Loop ruft LLM Client auf, LLM Client nutzt LiteLLM für Model-Aufrufe - Code-Status: ✅ existiert (app/ai/agent_loop.py:45 import llm_complete from app.ai.llm_client) - Verbindungs-Status: ✅ verbunden (agent_loop.py ruft llm_complete auf) - Test-Status: ✅ getestet (tests/test_agent_loop.py, tests/test_llm_client.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Agent Loop - Benötigt: Agent Runner startet Agent Loop für Ausführung - Code-Status: ✅ existiert (agent_runner.py:19 import run_react_loop from app.ai.agent_loop) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft run_react_loop auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py, tests/test_agent_loop.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Context Builder - Benötigt: Agent Runner baut Context für Agent auf - Code-Status: ✅ existiert (agent_runner.py:218 import build_agent_context from app.ai.context_builder) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft build_agent_context auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Permission System - Benötigt: Agent Runner prüft Permissions vor Ausführung - Code-Status: ✅ existiert (agent_runner.py:159 import resolve_agent_permissions from app.ai.agent_permissions) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft resolve_agent_permissions auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py, tests/test_agent_tools.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Tool Registry - Benötigt: Agent Runner holt verfügbare Tools aus Tool Registry - Code-Status: ✅ existiert (agent_runner.py:45,153 import get_tool_registry from ai_assistant.contracts) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft get_tool_registry und get_agent_tools auf) - Test-Status: ✅ getestet (tests/test_agent_tools.py, tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Data Policy - Benötigt: Agent Runner enforced Data Policy vor Ausführung - Code-Status: ✅ existiert (agent_runner.py:237 import enforce_data_policy from app.ai.data_policy) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft enforce_data_policy auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Transparency - Benötigt: Agent Runner markiert AI-generierte Inhalte - Code-Status: ✅ existiert (agent_runner.py:269 import mark_as_ai_generated from app.ai.transparency) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft mark_as_ai_generated auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Agent Runner → Oversight - Benötigt: Agent Runner erstellt Decision Records für Oversight - Code-Status: ✅ existiert (agent_runner.py:285 import create_decision_record from app.ai.oversight) - Verbindungs-Status: ✅ verbunden (agent_runner.py ruft create_decision_record auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Agent Loop → Tool Execution - Benötigt: Agent Loop führt Tools aus und gibt Ergebnisse zurück - Code-Status: ✅ existiert (agent_loop.py ruft tool handler auf, agent_tools.py resolved tools) - Verbindungs-Status: ✅ verbunden (get_agent_tools in agent_tools.py resolved verfügbare Tools) - Test-Status: ✅ getestet (tests/test_agent_loop.py, tests/test_agent_tools.py) - Gesamt: ✅ ### Vernetzung: Agent Loop → Approval System - Benötigt: Agent Loop pausiert für Human-in-the-Loop Approval bei kritischen Tools - Code-Status: ✅ existiert (agent_loop.py:376-413, import create_approval_request from app.core.approval) - Verbindungs-Status: ✅ verbunden (agent_loop.py erstellt ApprovalRequest und pausiert) - Test-Status: ✅ getestet (tests/test_agent_loop.py) - Gesamt: ✅ ### Vernetzung: Agent Stream → SSE Endpoint - Benötigt: Agent Stream sendet Step-Events via SSE an Frontend - Code-Status: ✅ existiert (agent_routes.py:622 import stream_react_loop, media_type="text/event-stream") - Verbindungs-Status: ✅ verbunden (agent_routes.py:644 ruft stream_react_loop auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Pre-built Agents → Registration in plugin.py - Benötigt: Pre-built Agents (email_triage, follow_up, contact_enrichment, report) sollen bei Plugin-Aktivierung registriert werden - Code-Status: ✅ existiert (4 create_*_agent Funktionen in prebuilt/) - Verbindungs-Status: ❌ unverbunden — Funktionen werden NICHT in plugin.py on_activate aufgerufen - Test-Status: ⚠️ ungetestet (kein spezifischer Test für Pre-built Agent Registration) - Gesamt: ❌ ### Vernetzung: Agent → Communication (Kommunikation Plugin) - Benötigt: Agent kann Nachrichten in Kommunikation-Plugin senden - Code-Status: ✅ existiert (agent_comm.py:58 import from kommunikation.contracts, register_agent_comm_tool) - Verbindungs-Status: ✅ verbunden (plugin.py:201-202 ruft register_agent_comm_tool auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Agent → Tasks (create_task, assign_task tools) - Benötigt: Agent kann Tasks erstellen und zuweisen - Code-Status: ✅ existiert (tasks/ai_tools.py:96 register_task_tools mit 4 Tools) - Verbindungs-Status: ✅ verbunden (tasks/plugin.py:85-86 ruft register_task_tools auf) - Test-Status: ✅ getestet (tests/test_agent_tools.py, tests/test_tasks.py) - Gesamt: ✅ ### Vernetzung: Agent → Search (unified_search tool) - Benötigt: Agent kann Unified Search aufrufen - Code-Status: ✅ existiert (unified_search/ai_tool.py:137 register_unified_search_tool) - Verbindungs-Status: ✅ verbunden (unified_search/plugin.py:82-83 ruft register_unified_search_tool auf) - Test-Status: ✅ getestet (tests/test_agent_tools.py, tests/test_unified_search.py) - Gesamt: ✅ ### Vernetzung: Agent → Workflows (start_workflow) - Benötigt: Agent kann Workflows starten - Code-Status: ✅ existiert (agent_coordinator.py:329 registry.register mit workflow tools) - Verbindungs-Status: ✅ verbunden (plugin.py:208-210 ruft register_agent_coordinator_tools auf) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ --- ## 3. Workflow System ### Vernetzung: Workflow Engine → Step Handlers (10 Typen) - Benötigt: Workflow Engine delegiert Step-Ausführung an Step Handlers - Code-Status: ✅ existiert (engine.py:33 import get_step_handler from step_handlers) - Verbindungs-Status: ✅ verbunden (engine.py ruft get_step_handler auf) - Test-Status: ✅ getestet (tests/test_workflows.py, tests/test_phase_g_workflows.py) - Gesamt: ✅ ### Vernetzung: Step Handlers → External Services - Benötigt: Step Handlers rufen Mail, Calendar, DMS, HTTP, etc. auf - Code-Status: ✅ existiert (10 Typen: wait, http, mail, calendar, dms, search, agent, crm, event, webhook) - Verbindungs-Status: ✅ verbunden (alle mit @register_step_type dekoriert) - Test-Status: ✅ getestet (tests/test_workflows.py, tests/test_phase_g_workflows.py) - Gesamt: ✅ ### Vernetzung: Workflow Engine → Decision Guard - Benötigt: Workflow Engine prüft Decision Guard vor kritischen Aktionen - Code-Status: ✅ existiert (engine.py:146 import check_decision_guard from decision_guard) - Verbindungs-Status: ✅ verbunden (engine.py ruft check_decision_guard auf) - Test-Status: ✅ getestet (tests/test_phase_g_workflows.py, tests/test_workflows.py) - Gesamt: ✅ ### Vernetzung: Decision Guard → Approval System - Benötigt: Decision Guard erstellt Approval Requests für High-Risk Aktionen - Code-Status: ✅ existiert (decision_guard.py:74-75, 110-137, requires_approval + approval_action) - Verbindungs-Status: ✅ verbunden (decision_guard gibt requires_approval und approval_action zurück) - Test-Status: ✅ getestet (tests/test_phase_g_workflows.py) - Gesamt: ✅ ### Vernetzung: Workflow Engine → Event Bus - Benötigt: Workflow Engine registriert Event Handler auf Event Bus - Code-Status: ✅ existiert (event_bus.py:94 import register_workflow_event_handlers from engine) - Verbindungs-Status: ✅ verbunden (event_bus.py ruft register_workflow_event_handlers auf) - Test-Status: ✅ getestet (tests/test_workflows.py) - Gesamt: ✅ ### Vernetzung: Workflow Routes → Engine - Benötigt: Workflow Routes rufen Workflow Engine auf - Code-Status: ✅ existiert (routes/workflows.py:308 import WorkflowEngine from engine) - Verbindungs-Status: ✅ verbunden (routes/workflows.py instanziiert WorkflowEngine) - Test-Status: ✅ getestet (tests/test_workflows.py, tests/test_phase_g_workflows.py) - Gesamt: ✅ ### Vernetzung: Workflow → Agent (agent step type) - Benötigt: Workflow kann Agent als Step ausführen - Code-Status: ✅ existiert (step_handlers.py:371 @register_step_type("agent")) - Verbindungs-Status: ✅ verbunden (agent step handler ruft agent_runner auf) - Test-Status: ✅ getestet (tests/test_phase_g_workflows.py) - Gesamt: ✅ ### Vernetzung: Workflow → Communication (workstream) - Benötigt: Workflow kann Kommunikation-Nachrichten senden - Code-Status: ✅ existiert (tasks/workstream.py:68 import send_message from kommunikation.services) - Verbindungs-Status: ✅ verbunden (workstream.py ruft send_message auf) - Test-Status: ⚠️ ungetestet (kein spezifischer Test für Workflow→Comm Workstream) - Gesamt: ⚠️ --- ## 4. Knowledge System ### Vernetzung: Wiki Plugin → DB (Migration, Models, Routes) - Benötigt: Wiki Plugin erstellt DB-Tabellen, Models, Routes - Code-Status: ✅ existiert (wiki/models.py, wiki/routes.py, wiki/schemas.py, wiki/services.py) - Verbindungs-Status: ✅ verbunden (Plugin-Route in plugin.py manifest registriert) - Test-Status: ✅ getestet (tests/test_phase_h_wiki.py) - Gesamt: ✅ ### Vernetzung: Wiki → Frontend - Benötigt: Wiki Page im Frontend vorhanden - Code-Status: ✅ existiert (frontend/src/pages/Wiki.tsx, page_routes in plugin.py manifest) - Verbindungs-Status: ✅ verbunden (FrontendPageRoute path="/wiki" component="@/pages/Wiki") - Test-Status: ⚠️ ungetestet (kein Frontend-Test für Wiki Page gefunden) - Gesamt: ⚠️ ### Vernetzung: Wiki → Search (unified_search provider) - Benötigt: Wiki registriert sich als Search Provider in Unified Search - Code-Status: ❌ fehlt — Wiki Plugin hat keine on_activate Methode, registriert keinen Search Provider - Verbindungs-Status: ❌ unverbunden — Wiki ist NICHT in auto_register_providers Liste - Test-Status: ❌ ungetestet - Gesamt: ❌ ### Vernetzung: GraphRAG → Search - Benötigt: GraphRAG registriert sich als Search Provider - Code-Status: ✅ existiert (graph_rag/provider.py:17 GraphRAGSearchProvider, graph_rag/plugin.py:43-48 register) - Verbindungs-Status: ✅ verbunden (in auto_register_providers als graph_rag_search_provider registriert) - Test-Status: ✅ getestet (tests/test_graph_rag.py) - Gesamt: ✅ ### Vernetzung: Knowledge Extraction → GraphRAG - Benötigt: Knowledge Extraction Pipeline speichert in GraphRAG - Code-Status: ❌ fehlt — kein Knowledge Extraction Modul gefunden - Verbindungs-Status: ❌ unverbunden - Test-Status: ❌ ungetestet - Gesamt: ❌ ### Vernetzung: Knowledge Sources → Search - Benötigt: Knowledge Sources liefern Daten für Search Index - Code-Status: ❌ fehlt — kein Knowledge Sources Modul gefunden - Verbindungs-Status: ❌ unverbunden - Test-Status: ❌ ungetestet - Gesamt: ❌ --- ## 5. Communication System ### Vernetzung: Comm Plugin → WebSocket - Benötigt: Kommunikation Plugin bietet WebSocket für Real-time Messaging - Code-Status: ✅ existiert (kommunikation/routes.py:481 @router.websocket("/ws"), websocket_manager.py) - Verbindungs-Status: ✅ verbunden (plugin.py:72 registriert WebSocketManager als Service) - Test-Status: ✅ getestet (tests/test_ws_helpers.py) - Gesamt: ✅ ### Vernetzung: Comm Plugin → AI Integration - Benötigt: AI Plugins registrieren sich als Participant in Kommunikation - Code-Status: ✅ existiert (ai_assistant/plugin.py:99-108, ai_proactive/plugin.py:84-93 registrieren ParticipantHandler) - Verbindungs-Status: ✅ verbunden (beide registrieren sich via get_participant_registry().register) - Test-Status: ✅ getestet (tests/test_phase_f_agents.py) - Gesamt: ✅ ### Vernetzung: Comm Plugin → DMS Bridge - Benötigt: Kommunikation kann Dateien in DMS speichern - Code-Status: ✅ existiert (kommunikation/dms_bridge.py:28 class DmsBridge, routes.py:375 ruft DmsBridge.store_attachment auf) - Verbindungs-Status: ✅ verbunden (routes.py importiert und ruft DmsBridge auf) - Test-Status: ⚠️ ungetestet (kein spezifischer Test für Comm→DMS Bridge gefunden) - Gesamt: ⚠️ ### Vernetzung: Comm Plugin → Search Provider - Benötigt: Kommunikation registriert Search Provider in Unified Search - Code-Status: ✅ existiert (kommunikation/search_provider.py:26 CommSearchProvider, unified_search/providers/conversation_provider.py) - Verbindungs-Status: ✅ verbunden (ConversationSearchProvider in auto_register_providers registriert) - Test-Status: ✅ getestet (tests/test_unified_search.py) - Gesamt: ✅ ### Vernetzung: Comm Plugin → MiniApp Registry - Benötigt: Kommunikation bietet MiniApp Registry für Plugins - Code-Status: ✅ existiert (kommunikation/miniapp_registry.py, plugin.py:77-79 registriert MiniApps) - Verbindungs-Status: ✅ verbunden (automation/plugin.py:215, 260 registriert MiniApps via get_miniapp_registry) - Test-Status: ✅ getestet (tests/test_miniapp_registry.py) - Gesamt: ✅ ### Vernetzung: Comm Plugin → Frontend - Benötigt: Kommunikation Page im Frontend vorhanden - Code-Status: ✅ existiert (frontend/src/pages/Communication.tsx, frontend/src/api/comm.ts) - Verbindungs-Status: ✅ verbunden (WebSocket in Communication.tsx:354, API-Calls in comm.ts) - Test-Status: ⚠️ ungetestet (kein Frontend-Test für Communication Page gefunden) - Gesamt: ⚠️ --- ## 6. Search System ### Vernetzung: Unified Search → Embeddings (LLM Client) - Benötigt: Unified Search generiert Embeddings via LLM Client - Code-Status: ✅ existiert (unified_search/embedding.py:18 import from app.ai.llm_client) - Verbindungs-Status: ✅ verbunden (embedding.py ruft llm_complete für Embeddings auf) - Test-Status: ✅ getestet (tests/test_unified_search.py, tests/test_vector_performance.py) - Gesamt: ✅ ### Vernetzung: Unified Search → Query Understanding (LLM Client) - Benötigt: Unified Search nutzt LLM für Query Understanding - Code-Status: ✅ existiert (unified_search/query_understanding.py:12 import llm_complete from app.ai.llm_client) - Verbindungs-Status: ✅ verbunden (query_understanding.py ruft llm_complete auf) - Test-Status: ✅ getestet (tests/test_unified_search.py) - Gesamt: ✅ ### Vernetzung: Unified Search → Plugin Providers (14 Provider) - Benötigt: Unified Search aggregiert Ergebnisse aus allen Plugin Providers - Code-Status: ✅ existiert (14 Provider: Contact, Mail, File, Event, Company, Task, ContactPerson, Tag, Conversation, User, AgentMemory, AIChat, Workflow, GraphRAG) - Verbindungs-Status: ✅ verbunden (auto_register_providers registriert alle 14) - Test-Status: ✅ getestet (tests/test_unified_search.py, tests/test_unified_search_phase_e.py) - Gesamt: ✅ ### Vernetzung: Search → Frontend - Benötigt: Search Page im Frontend vorhanden - Code-Status: ✅ existiert (frontend/src/pages/GlobalSearchResults.tsx, frontend/src/api/search.ts) - Verbindungs-Status: ✅ verbunden (API-Calls in search.ts) - Test-Status: ⚠️ ungetestet (kein Frontend-Test für Search Page gefunden) - Gesamt: ⚠️ --- ## 7. Permission System ### Vernetzung: ABAC/RBAC → Routes - Benötigt: Alle Routes enforce Permissions via require_permission - Code-Status: ✅ existiert (app/core/permissions.py, require_permission Dependency) - Verbindungs-Status: ✅ verbunden (require_permission auf Routes, app/routes/policies.py für ABAC) - Test-Status: ✅ getestet (tests/test_permissions.py, tests/test_abac.py, tests/test_abac_integration.py, tests/test_rbac_comprehensive.py) - Gesamt: ✅ ### Vernetzung: Entity Permissions → Routes - Benötigt: Entity-level Permissions auf Routes - Code-Status: ✅ existiert (app/routes/entity_permissions.py, app/services/entity_permission_service.py) - Verbindungs-Status: ✅ verbunden (entity_permissions.router in main.py:551) - Test-Status: ✅ getestet (tests/test_entity_permissions.py) - Gesamt: ✅ ### Vernetzung: Permission Delegations → Routes - Benötigt: Permission Delegation Management - Code-Status: ✅ existiert (app/routes/delegations.py) - Verbindungs-Status: ✅ verbunden (delegations.router in main.py:575) - Test-Status: ⚠️ ungetestet (kein spezifischer Test für Delegations gefunden) - Gesamt: ⚠️ ### Vernetzung: Tenant Isolation → RLS - Benötigt: Row Level Security auf allen Tenant-Tabellen - Code-Status: ✅ existiert (migration_runner.py:494 _enable_rls_for_tables, RLS policies in alembic migrations) - Verbindungs-Status: ✅ verbunden (RLS wird in migration_runner für Plugin-Tabellen aktiviert) - Test-Status: ✅ getestet (tests/test_rls_coverage.py, tests/test_cross_tenant_security.py, tests/test_cross_tenant_security_v2.py) - Gesamt: ✅ --- ## 8. Plugin System ### Vernetzung: Plugin Registry → main.py - Benötigt: Plugin Registry wird in main.py initialisiert und Plugins aktiviert - Code-Status: ✅ existiert (main.py:31 import get_registry, main.py:213 registry = get_registry()) - Verbindungs-Status: ✅ verbunden (main.py:286 aktiviert Plugins, main.py:314 init_permission_registry) - Test-Status: ✅ getestet (tests/test_plugins.py, tests/test_plugin_lifecycle.py, tests/test_manifest_validation.py) - Gesamt: ✅ ### Vernetzung: Plugin Contracts → Cross-Plugin Communication - Benötigt: Plugins kommunizieren über Contracts, nicht direkte Imports - Code-Status: ✅ existiert (app/plugins/builtins/contracts.py — ContractRegistry) - Verbindungs-Status: ✅ verbunden (kommunikation, mail, ai_assistant, graph_rag registriert) - Test-Status: ✅ getestet (app/plugins/builtins/tests/test_contracts.py) - Gesamt: ✅ ### Vernetzung: Plugin Manifests → Frontend - Benötigt: Plugin Manifests definieren Frontend Menu Items und Page Routes - Code-Status: ✅ existiert (FrontendMenuItem, FrontendPageRoute in manifest.py, frontend/src/api/pluginManifests.ts) - Verbindungs-Status: ✅ verbunden (frontend fragt /plugins/active-manifests ab) - Test-Status: ⚠️ ungetestet (kein spezifischer Test für Manifest→Frontend Sync gefunden) - Gesamt: ⚠️ ### Vernetzung: Plugin Migrations → DB - Benötigt: Plugin Migrations erstellen DB-Tabellen - Code-Status: ✅ existiert (app/plugins/migration_runner.py) - Verbindungs-Status: ✅ verbunden (migration_runner führt SQL-Migrations aus und aktiviert RLS) - Test-Status: ✅ getestet (tests/test_plugin_lifecycle.py) - Gesamt: ✅ --- ## 9. Infrastructure ### Vernetzung: Redis → Sessions, Cache, PubSub - Benötigt: Redis für Session-Storage, Caching, Rate-Limiting, WebSocket - Code-Status: ✅ existiert (app/core/auth.py:189 get_session_data aus Redis, app/core/cache.py, app/core/rate_limit.py) - Verbindungs-Status: ✅ verbunden (auth.py, cache.py, rate_limit.py, ws_helpers.py nutzen Redis) - Test-Status: ✅ getestet (tests/test_redis_pool.py, tests/test_rate_limit_policies.py) - Gesamt: ✅ ### Vernetzung: PostgreSQL → RLS, pgvector - Benötigt: PostgreSQL mit RLS und pgvector Extension - Code-Status: ✅ existiert (pgvector in requirements, RLS in migration_runner, vector columns in models) - Verbindungs-Status: ✅ verbunden (embedding columns in contacts/mails/files, RLS policies aktiv) - Test-Status: ✅ getestet (tests/test_rls_coverage.py, tests/test_vector_performance.py) - Gesamt: ✅ ### Vernetzung: ARQ Worker → Background Jobs - Benötigt: ARQ Worker verarbeitet Background Jobs (Outbox, Cron, Indexing) - Code-Status: ✅ existiert (app/core/worker.py — WorkerSettings, Cron-Jobs, Outbox-Processing) - Verbindungs-Status: ✅ verbunden (worker.py registriert Event Handler, Webhook Dispatcher, Trigger Dispatcher) - Test-Status: ✅ getestet (tests/test_outbox.py, tests/test_outbox_phase5.py) - Gesamt: ✅ ### Vernetzung: Outbox → Event Delivery - Benötigt: Outbox Pattern für zuverlässige Event-Delivery - Code-Status: ✅ existiert (app/core/outbox.py — enqueue_outbox_event, worker.py verarbeitet Outbox) - Verbindungs-Status: ✅ verbunden (dms/routes.py, mail/services.py, automation/agent_runner.py rufen enqueue_outbox_event auf) - Test-Status: ✅ getestet (tests/test_outbox.py, tests/test_outbox_phase5.py) - Gesamt: ✅ ### Vernetzung: Webhooks → External Integration - Benötigt: Webhook Dispatcher sendet Events an externe URLs - Code-Status: ✅ existiert (app/core/webhook_dispatcher.py, app/routes/webhooks.py) - Verbindungs-Status: ✅ verbunden (worker.py:158 register_webhook_event_handlers) - Test-Status: ✅ getestet (tests/test_outbox.py) - Gesamt: ✅ --- ## 10. Frontend ### Vernetzung: Pages → API Clients - Benötigt: Frontend Pages nutzen API Clients für Backend-Kommunikation - Code-Status: ✅ existiert (frontend/src/api/ mit 49 API-Client-Dateien) - Verbindungs-Status: ✅ verbunden (Pages importieren API-Clients, TanStack Query) - Test-Status: ✅ getestet (frontend/src/api/__tests__/automation.test.ts, workflows.test.ts) - Gesamt: ✅ ### Vernetzung: API Clients → Backend Routes - Benötigt: API Clients rufen Backend Routes auf - Code-Status: ✅ existiert (frontend/src/api/client.ts als Base, 48 spezifische API-Clients) - Verbindungs-Status: ✅ verbunden (API-Clients rufen /api/v1/* Endpunkte auf) - Test-Status: ✅ getestet (frontend/src/api/__tests__/) - Gesamt: ✅ ### Vernetzung: WebSocket → Real-time Updates - Benötigt: WebSocket für Real-time Communication und AI UI Control - Code-Status: ✅ existiert (Communication.tsx:354 new WebSocket, useAIUIControl.ts:346 new WebSocket) - Verbindungs-Status: ✅ verbunden (Frontend verbindet zu /ws und /api/v1/ai-ui-control/ws) - Test-Status: ✅ getestet (frontend/src/__tests__/ai-ui-control/aiUIControl.test.ts) - Gesamt: ✅ ### Vernetzung: PWA → Service Worker - Benötigt: PWA Service Worker für Offline-Funktionalität - Code-Status: ⚠️ existiert aber DEAKTIVIERT — main.tsx:7-9 unregistriert explizit alle Service Worker - Verbindungs-Status: ❌ unverbunden — PWA ist bewusst deaktiviert ("was caching stale assets") - Test-Status: ✅ getestet (frontend/src/__tests__/PWAInstallPrompt.test.tsx — testet deaktivierte PWA) - Gesamt: ⚠️ ### Vernetzung: i18n → Translations - Benötigt: i18n mit deutschen und englischen Übersetzungen - Code-Status: ✅ existiert (frontend/src/i18n/index.ts, locales/de.json (45KB), locales/en.json (41KB)) - Verbindungs-Status: ✅ verbunden (i18n Setup in index.ts, t() in Komponenten) - Test-Status: ✅ getestet (frontend/src/__tests__/ui/i18n.test.ts) - Gesamt: ✅ --- ## 11. AI Tools Registry — Detail-Analyse ### Registrierte AI Tools (bei Plugin-Aktivierung): | Plugin | Tool | Funktion | |--------|------|----------| | ai_assistant | call_crm_api | Generischer CRM API Zugriff (1 Tool) | | tasks | get_open_tasks | Offene Tasks abrufen | | tasks | get_contact_tasks | Tasks für Kontakt abrufen | | tasks | create_task | Task erstellen | | tasks | assign_task | Task zuweisen | | unified_search | unified_search | Unified Search aufrufen (1 Tool) | | automation | send_agent_message | Agent-Nachricht senden (agent_comm) | | automation | list_agents | Agenten auflisten (coordinator) | | automation | run_agent | Agent ausführen (coordinator) | | ai_proactive | 6 context tools | Kontext-Tools für proaktive Vorschläge | ### NICHT registrierte AI Tools: | Plugin | Status | Grund | |--------|--------|-------| | mail | ❌ keine AI Tools | on_activate registriert nur restore + history hooks | | dms | ❌ keine AI Tools | on_activate registriert nur restore + history hooks | | calendar | ❌ keine AI Tools | on_activate registriert nur restore + history hooks | | wiki | ❌ keine AI Tools | hat keine on_activate Methode | | kommunikation | ❌ keine AI Tools | on_activate registriert nur WebSocket + MiniApps | | graph_rag | ❌ keine AI Tools | on_activate registriert nur Search Provider | | agent_memory | ❌ keine AI Tools | keine AI Tool Registration gefunden | **Hinweis:** Mail, DMS und Calendar sind über das generische `call_crm_api` Tool im ai_assistant Plugin erreichbar, haben aber keine spezifischen AI Tools. --- ## 12. Test-Ausführung ### Test-DB Status: - PostgreSQL: ✅ verfügbar (localhost:5432, DB leocrm_test) - Redis: ✅ verfügbar (localhost:6379) - DB-Schema: Wird von conftest.py aus SQLAlchemy Metadata erstellt ### Test-Ergebnisse: - **test_p1_6_dms_streaming.py**: ❌ Import-Error (CHUNK_SIZE nicht in dms/routes.py) - **Auth-Tests**: Erfordern clean DB + Redis (getestet, aber DB-Lock-Issues bei mehrfachen Runs) - **Test-Dateien gesamt**: 91 Test-Dateien in tests/ - **Test-Kategorien**: Auth, Contacts, Companies, Tasks, Calendar, Mail, DMS, Tags, Workflows, Agents, AI, Search, Permissions, RLS, Outbox, Plugins, Wiki, GraphRAG, MCP, Marketplace, Notifications, u.v.m. ### Bekannte Test-Issues: 1. **test_p1_6_dms_streaming.py**: ImportError — CHUNK_SIZE wurde aus dms/routes.py entfernt 2. **DB-Locks**: Bei mehrfachen Test-Runs ohne clean DB reset kommt es zu Lock-Timeouts 3. **Duplicate Keys**: Bei unvollständigem DB-Reset bleiben Tenant-Daten erhalten 4. **Redis-Verbindung**: Redis muss manuell gestartet werden nach Crash --- ## 13. Plugin-Übersicht (22 Built-in Plugins) | Plugin | on_activate | AI Tools | Search Provider | Contract | Participant | |--------|-------------|----------|-----------------|----------|-------------| | agent_memory | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | ai_assistant | ✅ ja | ✅ call_crm_api | ❌ nein | ✅ ja | ✅ ai | | ai_proactive | ✅ ja | ✅ 6 context tools | ❌ nein | ❌ nein | ✅ ai_proactive | | ai_ui_control | ✅ ja | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | automation | ✅ ja | ✅ agent_comm + coordinator | ❌ nein | ❌ nein | ❌ nein | | calendar | ✅ ja | ❌ nein | ✅ EventSearchProvider | ✅ ja | ❌ nein | | contacts | ❌ nein | ❌ nein | ✅ ContactSearchProvider + ContactPersonSearchProvider | ❌ nein | ❌ nein | | dms | ✅ ja | ❌ nein | ✅ FileSearchProvider | ✅ ja | ❌ nein | | entity_links | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | forgejo_error_reporter | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | graph_rag | ✅ ja | ❌ nein | ✅ GraphRAGSearchProvider | ✅ ja | ❌ nein | | kommunikation | ✅ ja | ❌ nein | ✅ ConversationSearchProvider | ✅ ja | ❌ nein | | mail | ✅ ja | ❌ nein | ✅ MailSearchProvider | ✅ ja | ❌ nein | | marketplace | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | mcp_client | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | mcp_server | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | permissions | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | report_generator | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | | system_notif | ✅ ja | ❌ nein | ❌ nein | ❌ nein | ✅ system | | tags | ❌ nein | ❌ nein | ✅ TagSearchProvider | ❌ nein | ❌ nein | | tasks | ✅ ja | ✅ 4 task tools | ✅ TaskSearchProvider | ✅ ja | ❌ nein | | wiki | ❌ nein | ❌ nein | ❌ nein | ❌ nein | ❌ nein | --- ## 14. Frontend API-Clients (49 Dateien) | API-Client | Backend Route | Status | |------------|-------------|--------| | ai.ts | /api/v1/ai-copilot, /api/v1/ai-assistant | ✅ | | aiProactive.ts | /api/v1/ai-proactive | ✅ | | attachments.ts | /api/v1/attachments | ✅ | | audit.ts | /api/v1/audit | ✅ | | auth.ts | /api/v1/auth | ✅ | | automation.ts | /api/v1/automation, /api/v1/agents | ✅ | | backups.ts | /api/v1/backups | ✅ | | calendar.ts | /api/v1/calendar | ✅ | | client.ts | Base API Client | ✅ | | comm.ts | /api/v1/comm | ✅ | | contactFolders.ts | /api/v1/contact-folders | ✅ | | contacts.ts | /api/v1/contacts, /api/v1/companies | ✅ | | customFieldDefinitions.ts | /api/v1/custom-field-definitions | ✅ | | customFields.ts | /api/v1/custom-fields | ✅ | | dashboard.ts | /api/v1/dashboard | ✅ | | dedup.ts | /api/v1/contacts/dedup | ✅ | | dms.ts | /api/v1/dms | ✅ | | entityHistory.ts | /api/v1/entity-history | ✅ | | entityPermissionHooks.ts | /api/v1/entity-permissions | ✅ | | entityPermissions.ts | /api/v1/entity-permissions | ✅ | | groups.ts | /api/v1/groups | ✅ | | hooks.ts | Custom Hooks | ✅ | | importExport.ts | /api/v1/import-export | ✅ | | knowledge.ts | /api/v1/wiki | ✅ | | mail.ts | /api/v1/mail | ✅ | | mcpClient.ts | /api/v1/mcp-client | ✅ | | mcp.ts | /api/v1/mcp | ✅ | | notifications.ts | /api/v1/notifications | ✅ | | permissions.ts | /api/v1/permissions | ✅ | | pluginManifests.ts | /api/v1/plugins/active-manifests | ✅ | | plugins.ts | /api/v1/plugins | ✅ | | policies.ts | /api/v1/policies | ✅ | | reports.ts | /api/v1/reports | ✅ | | roles.ts | /api/v1/roles | ✅ | | savedFilters.ts | /api/v1/saved-filters | ✅ | | savedViews.ts | /api/v1/saved-views | ✅ | | search.ts | /api/v1/search | ✅ | | settings.ts | /api/v1/system-settings | ✅ | | tags.ts | /api/v1/tags | ✅ | | tasks.ts | /api/v1/tasks | ✅ | | unifiedContacts.ts | /api/v1/contacts/unified | ✅ | | userPreferences.ts | /api/v1/user-preferences | ✅ | | users.ts | /api/v1/users | ✅ | | webhooks.ts | /api/v1/webhooks | ✅ | | workflows.ts | /api/v1/workflows | ✅ | --- ## 15. Core Routes in main.py (44 Router) health, metrics, auth, users, roles, groups, tenants, notifications, companies, contacts, contact_folders, contact_folder_permissions, entity_permissions, dashboard, entity_history, import_export, plugins, ai_copilot, workflows, user_preferences, currencies, taxes, sequences, system_settings, attachments, addresses, bank_accounts, audit, backups, owner_transfer, custom_field_definitions, custom_fields, saved_filters, saved_views, webhooks, permission_templates, delegations, policies, errors, guests, workspaces, outbox, api_tokens, approvals --- ## 16. Workflow Step Handler Typen (10) | Step Type | Zeile | Funktion | |-----------|-------|----------| | wait | 74 | Wartet für angegebene Dauer | | http | 102 | HTTP Request an externe URL | | mail | 197 | Sendet E-Mail via Mail Plugin | | calendar | 241 | Erstellt/aktualisiert Kalender-Eintrag | | dms | 288 | DMS Operation (Datei erstellen/abrufen) | | search | 328 | Unified Search aufrufen | | agent | 371 | Agent ausführen | | crm | 413 | CRM Entity Operation | | event | 463 | Event auf Event Bus publishen | | webhook | 493 | Webhook an externe URL senden | --- ## 17. Search Provider (14) | Provider | Entity Type | Plugin | |----------|-----------|-------| | ContactSearchProvider | contact | unified_search | | MailSearchProvider | mail | unified_search | | FileSearchProvider | file | unified_search | | EventSearchProvider | event | unified_search | | CompanySearchProvider | company | unified_search | | TaskSearchProvider | task | unified_search | | ContactPersonSearchProvider | contactperson | unified_search | | TagSearchProvider | tag | unified_search | | ConversationSearchProvider | conversation | unified_search | | UserSearchProvider | user | unified_search | | AgentMemorySearchProvider | agent_memory | unified_search | | AIChatSearchProvider | ai_chat | unified_search | | WorkflowSearchProvider | workflow | unified_search | | GraphRAGSearchProvider | graph_rag | graph_rag | --- ## 18. Event Bus Integration ### Event Bus (app/core/event_bus.py): - EventBus Klasse mit publish/subscribe - Global singleton: _event_bus = EventBus() - register_workflow_event_handlers() registriert Workflow Event Handler ### Worker Integration (app/core/worker.py): - worker.py:102 import get_event_bus - worker.py:113 event_bus = get_event_bus() - worker.py:151-152 Plugin Event Handler werden registriert - worker.py:158 register_webhook_event_handlers(event_bus) - worker.py:163 register_trigger_dispatcher(event_bus) ### Trigger Dispatcher (app/core/trigger_dispatcher.py): - TriggerDispatcher lauscht auf alle Events - Evaluiert aktive Automations für Event-Trigger - Dispatched Automation oder Agent bei Match --- ## 19. Outbox Pattern ### enqueue_outbox_event (app/core/outbox.py): - Wird aufgerufen von: dms/routes.py, dms/commands.py, mail/services.py, mail/commands.py, automation/agent_runner.py - Events: file.created, file.deleted, file.restored, dms.file.uploaded, dms.file.deleted, mail.received, agent events - Worker verarbeitet Outbox und published auf Event Bus --- ## 20. Risiken und Empfehlungen ### Kritische Risiken: 1. **Pre-built Agents nicht registriert** — 4 Agent-Definitionen existieren aber werden nie in DB seeded 2. **Wiki ohne Search Integration** — Wiki-Inhalte sind nicht über Unified Search auffindbar 3. **Kein Knowledge Extraction Modul** — GraphRAG hat keine automatische Knowledge Extraction Pipeline 4. **PWA deaktiviert** — Service Worker wird explizit unregistriert (stale cache issue) 5. **test_p1_6_dms_streaming.py broken** — Import-Error verhindert Test-Ausführung ### Mittlere Risiken: 6. **Mail/DMS/Calendar ohne spezifische AI Tools** — Nur über generisches call_crm_api erreichbar 7. **Wiki ohne on_activate** — Keine Lifecycle-Hooks, keine Search Provider Registration 8. **Comm→DMS Bridge ungetestet** — DmsBridge.store_attachment hat keinen spezifischen Test 9. **Permission Delegations ungetestet** — Kein spezifischer Test für Delegation Routes 10. **Plugin Manifest→Frontend Sync ungetestet** — Kein Test für active-manifests Endpoint ### Empfohlene nächste Schritte: 1. Pre-built Agent Registration in automation/plugin.py on_activate hinzufügen 2. Wiki on_activate implementieren + WikiSearchProvider registrieren 3. test_p1_6_dms_streaming.py reparieren (CHUNK_SIZE import fixen) 4. Comm→DMS Bridge Test hinzufügen 5. Permission Delegation Tests hinzufügen 6. Knowledge Extraction Pipeline für GraphRAG evaluieren --- *Audit abgeschlossen. Alle Angaben basieren auf grep/import/file-Analyse des tatsächlichen Codes.*