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:
- Pre-built Agents (4 definiert) werden NICHT bei Plugin-Aktivierung registriert
- Wiki Plugin hat keine
on_activate → kein Search Provider, keine AI-Tools
- Mail/DMS/Calendar registrieren KEINE AI-Tools (nur restore + history hooks)
- PWA Service Worker ist explizit DEAKTIVIERT (unregister in main.tsx)
- test_p1_6_dms_streaming.py hat Import-Error (CHUNK_SIZE nicht in dms/routes.py)
- 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: ✅
- 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:
- test_p1_6_dms_streaming.py: ImportError — CHUNK_SIZE wurde aus dms/routes.py entfernt
- DB-Locks: Bei mehrfachen Test-Runs ohne clean DB reset kommt es zu Lock-Timeouts
- Duplicate Keys: Bei unvollständigem DB-Reset bleiben Tenant-Daten erhalten
- 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:
- Pre-built Agents nicht registriert — 4 Agent-Definitionen existieren aber werden nie in DB seeded
- Wiki ohne Search Integration — Wiki-Inhalte sind nicht über Unified Search auffindbar
- Kein Knowledge Extraction Modul — GraphRAG hat keine automatische Knowledge Extraction Pipeline
- PWA deaktiviert — Service Worker wird explizit unregistriert (stale cache issue)
- test_p1_6_dms_streaming.py broken — Import-Error verhindert Test-Ausführung
Mittlere Risiken:
- Mail/DMS/Calendar ohne spezifische AI Tools — Nur über generisches call_crm_api erreichbar
- Wiki ohne on_activate — Keine Lifecycle-Hooks, keine Search Provider Registration
- Comm→DMS Bridge ungetestet — DmsBridge.store_attachment hat keinen spezifischen Test
- Permission Delegations ungetestet — Kein spezifischer Test für Delegation Routes
- Plugin Manifest→Frontend Sync ungetestet — Kein Test für active-manifests Endpoint
Empfohlene nächste Schritte:
- Pre-built Agent Registration in automation/plugin.py on_activate hinzufügen
- Wiki on_activate implementieren + WikiSearchProvider registrieren
- test_p1_6_dms_streaming.py reparieren (CHUNK_SIZE import fixen)
- Comm→DMS Bridge Test hinzufügen
- Permission Delegation Tests hinzufügen
- Knowledge Extraction Pipeline für GraphRAG evaluieren
Audit abgeschlossen. Alle Angaben basieren auf grep/import/file-Analyse des tatsächlichen Codes.