Files
leocrm/COMPLETE_SYSTEM_AUDIT.md
T

39 KiB

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:
  • 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:
  • 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:

  1. Mail/DMS/Calendar ohne spezifische AI Tools — Nur über generisches call_crm_api erreichbar
  2. Wiki ohne on_activate — Keine Lifecycle-Hooks, keine Search Provider Registration
  3. Comm→DMS Bridge ungetestet — DmsBridge.store_attachment hat keinen spezifischen Test
  4. Permission Delegations ungetestet — Kein spezifischer Test für Delegation Routes
  5. 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.