diff --git a/COMPLETE_SYSTEM_AUDIT.md b/COMPLETE_SYSTEM_AUDIT.md new file mode 100644 index 0000000..f657677 --- /dev/null +++ b/COMPLETE_SYSTEM_AUDIT.md @@ -0,0 +1,782 @@ +# 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.*