Files
leocrm/COMPLETE_SYSTEM_AUDIT.md
T

783 lines
39 KiB
Markdown

# 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.*