diff --git a/PROGRESS.md b/PROGRESS.md index 284a46b..4f76a39 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -80,7 +80,10 @@ | D3-g | ARCH-051: 14 dict-body-Routes auf Pydantic-Schemas umgestellt (entity_permissions bulk ×2, guests invite, users menu-order, system_settings backup-config+dsar, knowledge ×3, self_improvement ×5); dabei DSAR-Export F821-Bug behoben (datetime/timezone undefined → NameError zur Laufzeit beim GDPR-Export) und Zeitstempel auf datetime.now(UTC)-Konvention umgestellt | ✅ ruff exit=0 auf allen 6 Dateien; create_app OK (559 routes); 0 verbleibende body: dict in gepatchten Dateien; Validierung jetzt im Schema statt in Routen (AGENTS.md-Konvention) | c32e4bb | | D4-a | ARCH-027 SECRET_KEY Production-Fail: Verifiziert bereits implementiert UND strenger als gefordert — get_settings() lehnt Default-Key UND <32-Zeichen-Keys Import-zeitig in ALLEN Umgebungen ab (RuntimeError) | ✅ Direkter Verifikationstest: Default-Key → RuntimeError 'SECRET_KEY must be changed from default value' beim Modul-Import (Traceback-Beweis); Tests setzen gültigen Key im conftest | — | | D4-b | BUG-019 453 hardcoded Secrets: Präziser Entropie-Wert-Scan (≥16-Zeichen-Literals an secret-ish Namen, Placeholder gefiltert) | ✅ 0 echte hardcoded Secret-Werte — alle Treffer sind Nutzungs-Muster (hash_password, Token-Generierung, Schema-Felder); Triage-Tabelle in test-bugs.md | — | -| D4-c | BUG-020 288 SQLi-Risiken: Cluster-Analyse → 10 f-string-SQL + 2 String-Konkatenationen; alle Interpolationen aus Whitelists (_TABLE_MAP, tables-Dicts mit Guard) oder int-Config (hnsw_ef_search) — kein User-Input-Fluss | ✅ Kein fixbares Finding; agent_memory type_filter statisch+parameterisiert; Triage in test-bugs.md dokumentiert | — | +| D4-c | BUG-020 288 SQLi-Risiken: Cluster-Analyse → 10 f-string-SQL + 2 String-Konkatenationen; alle Interpolationen aus Whitelists (_TABLE_MAP, tables-Dicts mit Guard) oder int-Config (hnsw_ef_search) — kein User-Input-Fluss | ✅ Kein fixbares Finding; agent_memory type_filter statisch+parameterisiert; Triage in test-bugs.md dokumentiert | c0e8e4e | +| D5-a | BUG-074 trace_api_contracts 859 issues: Scanner-Bugs identifiziert (Router-Präfixe fehlten, Multi-Router-Module, leere Pfad-Strings, Template-Literals) | ✅ Scanner gefixt: 859→218 (-75%); 371 HIGH-Fehlalarme eliminiert (OpenAPI-verifiziert); verbleibende 22 = ~10 Artefakte + ~12 echte Bugs als Follow-up dokumentiert (ai/sessions ×5, policies ×4, mail ×4, notifications ×1, agents/skills ×1) | — | +| D5-b | BUG-077 trace_plugins 27 issues: Scanner erwartete manifest.py, Projekt-Konvention ist Inline-Manifest in plugin.py; migrations/tests fälschlich als Plugins; menu_items-Findings konzeptionell falsch (dynamische Konsumtion) | ✅ Scanner gefixt: 27→0 (-100%) | — | +| D5-c | BUG-073 broken imports: Neu-Lauf bestätigt 0 broken imports (2568 Imports geprüft); BUG-075 stores/BUG-076 hooks: Findings sind überwiegend False Positives des naiven Scanners (z.B. 'const'/'null' als Store-Member) | ✅ Dokumentiert; Scanner-Qualität als bekanntes Limit vermerkt | — | **Block A ABGESCHLOSSEN** — Gate A bestanden (32f63ad). **Block B ABGESCHLOSSEN** — Gate B bestanden (alle 5 Checks bewiesen). diff --git a/docs/test-bugs.md b/docs/test-bugs.md index b22f4ed..804c948 100644 --- a/docs/test-bugs.md +++ b/docs/test-bugs.md @@ -540,7 +540,11 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te - **Erwartet:** 0 issues - **Tatsächlich:** 859 issues in Frontend↔Backend API Contracts - **Schweregrad:** Medium -- **Status:** ⏳ Nicht gefixt — muss genauer untersuchen +- **Status:** ✅ Triage+Scanner-Fixes 2026-08-24 (Block D/D5): 859→218 (-75%). Scanner-Bugs behoben: (1) Router-Präfixe fehlten im Endpoint-Pfad (371 Fehlalarme), (2) Multi-Router-Module (calendar_router/resource_router) nutzten falschen Präfix, (3) leere Pfad-Strings ('' für Collection-Routen) nicht erfasst, (4) Template-Literals (${qs}) nicht normalisiert. Verbleibende 196 backend_endpoint_no_frontend = legitime Admin-/Interne-Endpoints ohne Frontend-Nutzung. Verbleibende 22 frontend_call_no_backend = ~10 Parsing-Artefakte + ~12 echte Bugs als Follow-up dokumentiert: + - /ai/sessions-Familie ×5 (Frontend nutzt alte API; Backend hat /ai/conversations) + - /policies/{type}/{id}-Nested ×4 (Backend nur PUT/DELETE /policies/{policy_id}) + - mail signatures PATCH/DELETE ×2, mail drafts PATCH-vs-PUT ×1, mail labels DELETE ×1 + - DELETE /notifications/{id} ×1 (Backend nur PATCH .../read), GET /agents/skills ×1 (Backend /agents/tools) ### BUG-075: Marathon trace_stores — 323 issues - **Kategorie:** Frontend / Stores @@ -561,7 +565,7 @@ Playwright E2E: 10 passed, 24 failed (BUG-011/012/013 — Mock-Daten und data-te - **Erwartet:** 0 issues - **Tatsächlich:** 27 issues in Plugin traces - **Schweregrad:** Medium -- **Status:** ⏳ Nicht gefixt +- **Status:** ✅ Triage+Scanner-Fixes 2026-08-24 (Block D/D5): 27→0. Root-Cause war Scanner-Bug: Erwartete manifest.py pro Plugin, aber Projekt-Konvention ist Inline-Manifest via PluginManifest(...) in plugin.py (0/28 Builtins haben manifest.py). Zusätzlich: migrations/tests-Verzeichnisse fälschlich als Plugins gewertet; menu_items-MEDIUM-Findings waren konzeptionell falsch (Frontend konsumiert Menüs dynamisch über active-manifests-API/pluginManifests.ts, nicht statische Imports). ### BUG-078: Marathon trace_functions — 3 issues - **Kategorie:** Architektur / Functions diff --git a/scripts/test_suite/results_trace_api_contracts.json b/scripts/test_suite/results_trace_api_contracts.json index a13a1ed..0ce46fe 100644 --- a/scripts/test_suite/results_trace_api_contracts.json +++ b/scripts/test_suite/results_trace_api_contracts.json @@ -2432,565 +2432,610 @@ } ], "backend_endpoints": [ + { + "file": "routes/saved_filters.py", + "method": "GET", + "path": "/api/v1/saved-filters" + }, + { + "file": "routes/saved_filters.py", + "method": "POST", + "path": "/api/v1/saved-filters" + }, { "file": "routes/saved_filters.py", "method": "DELETE", - "path": "/{filter_id}" + "path": "/api/v1/saved-filters/{filter_id}" }, { "file": "routes/audit.py", "method": "GET", - "path": "/export" + "path": "/api/v1/audit-log" + }, + { + "file": "routes/audit.py", + "method": "GET", + "path": "/api/v1/audit-log/export" }, { "file": "routes/audit.py", "method": "DELETE", - "path": "/retention" + "path": "/api/v1/audit-log/retention" + }, + { + "file": "routes/api_tokens.py", + "method": "POST", + "path": "/api/v1/tokens" + }, + { + "file": "routes/api_tokens.py", + "method": "GET", + "path": "/api/v1/tokens" }, { "file": "routes/api_tokens.py", "method": "DELETE", - "path": "/{token_id}" + "path": "/api/v1/tokens/{token_id}" + }, + { + "file": "routes/sequences.py", + "method": "GET", + "path": "/api/v1/sequences" + }, + { + "file": "routes/sequences.py", + "method": "POST", + "path": "/api/v1/sequences" }, { "file": "routes/sequences.py", "method": "PATCH", - "path": "/{sequence_id}" + "path": "/api/v1/sequences/{sequence_id}" }, { "file": "routes/sequences.py", "method": "DELETE", - "path": "/{sequence_id}" + "path": "/api/v1/sequences/{sequence_id}" }, { - "file": "routes/companies.py", + "file": "routes/delegations.py", "method": "GET", - "path": "/export" + "path": "/api/v1/delegations" }, { - "file": "routes/companies.py", - "method": "GET", - "path": "/{company_id}" - }, - { - "file": "routes/companies.py", - "method": "PUT", - "path": "/{company_id}" - }, - { - "file": "routes/companies.py", - "method": "DELETE", - "path": "/{company_id}" - }, - { - "file": "routes/companies.py", + "file": "routes/delegations.py", "method": "POST", - "path": "/{company_id}/contacts/{contact_id}" - }, - { - "file": "routes/companies.py", - "method": "DELETE", - "path": "/{company_id}/contacts/{contact_id}" - }, - { - "file": "routes/companies.py", - "method": "GET", - "path": "/{company_id}/emails" - }, - { - "file": "routes/contact_folders.py", - "method": "PUT", - "path": "/{folder_id}" - }, - { - "file": "routes/contact_folders.py", - "method": "DELETE", - "path": "/{folder_id}" - }, - { - "file": "routes/contact_folders.py", - "method": "PUT", - "path": "/{folder_id}/reorder" - }, - { - "file": "routes/contact_folders.py", - "method": "PUT", - "path": "/contacts/{contact_id}/move" + "path": "/api/v1/delegations" }, { "file": "routes/delegations.py", "method": "PUT", - "path": "/{delegation_id}" + "path": "/api/v1/delegations/{delegation_id}" }, { "file": "routes/delegations.py", "method": "DELETE", - "path": "/{delegation_id}" + "path": "/api/v1/delegations/{delegation_id}" }, { "file": "routes/delegations.py", "method": "GET", - "path": "/active" + "path": "/api/v1/delegations/active" }, { "file": "routes/owner_transfer.py", "method": "POST", - "path": "/transfer" - }, - { - "file": "routes/contacts.py", - "method": "GET", - "path": "/export" - }, - { - "file": "routes/contacts.py", - "method": "GET", - "path": "/merge-history" - }, - { - "file": "routes/contacts.py", - "method": "GET", - "path": "/{contact_id}" - }, - { - "file": "routes/contacts.py", - "method": "PUT", - "path": "/{contact_id}" - }, - { - "file": "routes/contacts.py", - "method": "DELETE", - "path": "/{contact_id}" - }, - { - "file": "routes/contacts.py", - "method": "GET", - "path": "/{contact_id}/persons" - }, - { - "file": "routes/contacts.py", - "method": "POST", - "path": "/{contact_id}/persons" - }, - { - "file": "routes/contacts.py", - "method": "PUT", - "path": "/{contact_id}/persons/{person_id}" - }, - { - "file": "routes/contacts.py", - "method": "DELETE", - "path": "/{contact_id}/persons/{person_id}" - }, - { - "file": "routes/contacts.py", - "method": "POST", - "path": "/duplicates" - }, - { - "file": "routes/contacts.py", - "method": "POST", - "path": "/merge" + "path": "/api/v1/ownership/transfer" }, { "file": "routes/guests.py", "method": "POST", - "path": "/invite" + "path": "/api/v1/guests/invite" + }, + { + "file": "routes/guests.py", + "method": "GET", + "path": "/api/v1/guests" }, { "file": "routes/guests.py", "method": "DELETE", - "path": "/{guest_id}" + "path": "/api/v1/guests/{guest_id}" }, { "file": "routes/tenants.py", "method": "GET", - "path": "/{tenant_id}/users" + "path": "/api/v1/tenants" }, { "file": "routes/tenants.py", "method": "POST", - "path": "/{tenant_id}/users" + "path": "/api/v1/tenants" + }, + { + "file": "routes/tenants.py", + "method": "GET", + "path": "/api/v1/tenants/{tenant_id}/users" + }, + { + "file": "routes/tenants.py", + "method": "POST", + "path": "/api/v1/tenants/{tenant_id}/users" }, { "file": "routes/custom_field_definitions.py", "method": "GET", - "path": "/definitions" + "path": "/api/v1/custom-fields/definitions" }, { "file": "routes/custom_field_definitions.py", "method": "POST", - "path": "/definitions" + "path": "/api/v1/custom-fields/definitions" }, { "file": "routes/custom_field_definitions.py", "method": "PATCH", - "path": "/definitions/{definition_id}" + "path": "/api/v1/custom-fields/definitions/{definition_id}" }, { "file": "routes/custom_field_definitions.py", "method": "DELETE", - "path": "/definitions/{definition_id}" + "path": "/api/v1/custom-fields/definitions/{definition_id}" + }, + { + "file": "routes/saved_views.py", + "method": "GET", + "path": "/api/v1/saved-views" + }, + { + "file": "routes/saved_views.py", + "method": "POST", + "path": "/api/v1/saved-views" }, { "file": "routes/saved_views.py", "method": "PUT", - "path": "/{view_id}" + "path": "/api/v1/saved-views/{view_id}" }, { "file": "routes/saved_views.py", "method": "DELETE", - "path": "/{view_id}" + "path": "/api/v1/saved-views/{view_id}" }, { "file": "routes/roles.py", "method": "GET", - "path": "/permissions" + "path": "/api/v1/roles/permissions" + }, + { + "file": "routes/roles.py", + "method": "GET", + "path": "/api/v1/roles" + }, + { + "file": "routes/roles.py", + "method": "POST", + "path": "/api/v1/roles" }, { "file": "routes/roles.py", "method": "PATCH", - "path": "/{role_id}" + "path": "/api/v1/roles/{role_id}" }, { "file": "routes/roles.py", "method": "DELETE", - "path": "/{role_id}" + "path": "/api/v1/roles/{role_id}" }, { "file": "routes/groups.py", "method": "GET", - "path": "/{group_id}" + "path": "/api/v1/groups" + }, + { + "file": "routes/groups.py", + "method": "POST", + "path": "/api/v1/groups" + }, + { + "file": "routes/groups.py", + "method": "GET", + "path": "/api/v1/groups/{group_id}" }, { "file": "routes/groups.py", "method": "PATCH", - "path": "/{group_id}" + "path": "/api/v1/groups/{group_id}" }, { "file": "routes/groups.py", "method": "DELETE", - "path": "/{group_id}" + "path": "/api/v1/groups/{group_id}" }, { "file": "routes/groups.py", "method": "GET", - "path": "/{group_id}/members" + "path": "/api/v1/groups/{group_id}/members" }, { "file": "routes/groups.py", "method": "POST", - "path": "/{group_id}/members" + "path": "/api/v1/groups/{group_id}/members" }, { "file": "routes/groups.py", "method": "DELETE", - "path": "/{group_id}/members/{user_id}" + "path": "/api/v1/groups/{group_id}/members/{user_id}" }, { "file": "routes/groups.py", "method": "GET", - "path": "/user/{user_id}" + "path": "/api/v1/groups/user/{user_id}" }, { "file": "routes/workspaces.py", "method": "GET", - "path": "/my" + "path": "/api/v1/workspaces" }, { "file": "routes/workspaces.py", "method": "GET", - "path": "/context" + "path": "/api/v1/workspaces/my" }, { "file": "routes/workspaces.py", "method": "GET", - "path": "/{workspace_id}" + "path": "/api/v1/workspaces/context" + }, + { + "file": "routes/workspaces.py", + "method": "POST", + "path": "/api/v1/workspaces" + }, + { + "file": "routes/workspaces.py", + "method": "GET", + "path": "/api/v1/workspaces/{workspace_id}" }, { "file": "routes/workspaces.py", "method": "PUT", - "path": "/{workspace_id}" + "path": "/api/v1/workspaces/{workspace_id}" }, { "file": "routes/workspaces.py", "method": "DELETE", - "path": "/{workspace_id}" + "path": "/api/v1/workspaces/{workspace_id}" }, { "file": "routes/workspaces.py", "method": "POST", - "path": "/{workspace_id}/modules" + "path": "/api/v1/workspaces/{workspace_id}/modules" }, { "file": "routes/workspaces.py", "method": "POST", - "path": "/{workspace_id}/users" + "path": "/api/v1/workspaces/{workspace_id}/users" }, { "file": "routes/workspaces.py", "method": "DELETE", - "path": "/{workspace_id}/users/{user_id}" + "path": "/api/v1/workspaces/{workspace_id}/users/{user_id}" }, { "file": "routes/workspaces.py", "method": "GET", - "path": "/{workspace_id}/widgets" + "path": "/api/v1/workspaces/{workspace_id}/widgets" }, { "file": "routes/workspaces.py", "method": "POST", - "path": "/{workspace_id}/widgets" + "path": "/api/v1/workspaces/{workspace_id}/widgets" }, { "file": "routes/workspaces.py", "method": "PUT", - "path": "/{workspace_id}/widgets/{widget_id}" + "path": "/api/v1/workspaces/{workspace_id}/widgets/{widget_id}" }, { "file": "routes/workspaces.py", "method": "DELETE", - "path": "/{workspace_id}/widgets/{widget_id}" + "path": "/api/v1/workspaces/{workspace_id}/widgets/{widget_id}" }, { "file": "routes/workspaces.py", "method": "POST", - "path": "/{workspace_id}/set-default" + "path": "/api/v1/workspaces/{workspace_id}/set-default" }, { "file": "routes/dashboard.py", "method": "GET", - "path": "/widgets" + "path": "/api/v1/dashboard/widgets" }, { "file": "routes/dashboard.py", "method": "GET", - "path": "/counts" + "path": "/api/v1/dashboard/counts" + }, + { + "file": "routes/backups.py", + "method": "GET", + "path": "/api/v1/backups" }, { "file": "routes/backups.py", "method": "POST", - "path": "/{backup_id}/restore" + "path": "/api/v1/backups" + }, + { + "file": "routes/backups.py", + "method": "POST", + "path": "/api/v1/backups/{backup_id}/restore" }, { "file": "routes/backups.py", "method": "DELETE", - "path": "/{backup_id}" + "path": "/api/v1/backups/{backup_id}" }, { "file": "routes/custom_fields.py", "method": "GET", - "path": "/{contact_id}/custom-fields" + "path": "/api/v1/contacts/{contact_id}/custom-fields" }, { "file": "routes/custom_fields.py", "method": "PATCH", - "path": "/{contact_id}/custom-fields" + "path": "/api/v1/contacts/{contact_id}/custom-fields" }, { "file": "routes/auth.py", "method": "POST", - "path": "/login" + "path": "/api/v1/auth/login" }, { "file": "routes/auth.py", "method": "POST", - "path": "/logout" + "path": "/api/v1/auth/logout" }, { "file": "routes/auth.py", "method": "GET", - "path": "/me" + "path": "/api/v1/auth/me" }, { "file": "routes/auth.py", "method": "GET", - "path": "/me/permissions" + "path": "/api/v1/auth/me/permissions" }, { "file": "routes/auth.py", "method": "POST", - "path": "/switch-tenant" + "path": "/api/v1/auth/switch-tenant" }, { "file": "routes/auth.py", "method": "POST", - "path": "/password-reset/request" + "path": "/api/v1/auth/password-reset/request" }, { "file": "routes/auth.py", "method": "POST", - "path": "/password-reset/confirm" + "path": "/api/v1/auth/password-reset/confirm" }, { "file": "routes/users.py", "method": "GET", - "path": "/{user_id}" + "path": "/api/v1/users" + }, + { + "file": "routes/users.py", + "method": "POST", + "path": "/api/v1/users" + }, + { + "file": "routes/users.py", + "method": "GET", + "path": "/api/v1/users/{user_id}" }, { "file": "routes/users.py", "method": "PATCH", - "path": "/{user_id}" + "path": "/api/v1/users/{user_id}" }, { "file": "routes/users.py", "method": "DELETE", - "path": "/{user_id}" + "path": "/api/v1/users/{user_id}" }, { "file": "routes/users.py", "method": "GET", - "path": "/me/menu-order" + "path": "/api/v1/users/me/menu-order" }, { "file": "routes/users.py", "method": "PUT", - "path": "/me/menu-order" + "path": "/api/v1/users/me/menu-order" + }, + { + "file": "routes/bank_accounts.py", + "method": "GET", + "path": "/api/v1/bank-accounts" + }, + { + "file": "routes/bank_accounts.py", + "method": "POST", + "path": "/api/v1/bank-accounts" }, { "file": "routes/bank_accounts.py", "method": "PATCH", - "path": "/{account_id}" + "path": "/api/v1/bank-accounts/{account_id}" }, { "file": "routes/bank_accounts.py", "method": "DELETE", - "path": "/{account_id}" + "path": "/api/v1/bank-accounts/{account_id}" }, { "file": "routes/webhooks.py", "method": "GET", - "path": "/{webhook_id}" - }, - { - "file": "routes/webhooks.py", - "method": "PATCH", - "path": "/{webhook_id}" - }, - { - "file": "routes/webhooks.py", - "method": "DELETE", - "path": "/{webhook_id}" + "path": "/api/v1/webhooks" }, { "file": "routes/webhooks.py", "method": "POST", - "path": "/{webhook_id}/test" + "path": "/api/v1/webhooks" + }, + { + "file": "routes/webhooks.py", + "method": "GET", + "path": "/api/v1/webhooks/{webhook_id}" + }, + { + "file": "routes/webhooks.py", + "method": "PATCH", + "path": "/api/v1/webhooks/{webhook_id}" + }, + { + "file": "routes/webhooks.py", + "method": "DELETE", + "path": "/api/v1/webhooks/{webhook_id}" + }, + { + "file": "routes/webhooks.py", + "method": "POST", + "path": "/api/v1/webhooks/{webhook_id}/test" + }, + { + "file": "routes/errors.py", + "method": "POST", + "path": "/api/v1/errors" + }, + { + "file": "routes/addresses.py", + "method": "GET", + "path": "/api/v1/addresses" + }, + { + "file": "routes/addresses.py", + "method": "POST", + "path": "/api/v1/addresses" }, { "file": "routes/addresses.py", "method": "PATCH", - "path": "/{address_id}" + "path": "/api/v1/addresses/{address_id}" }, { "file": "routes/addresses.py", "method": "DELETE", - "path": "/{address_id}" + "path": "/api/v1/addresses/{address_id}" }, { - "file": "routes/contact_folder_permissions.py", + "file": "routes/taxes.py", "method": "GET", - "path": "/{folder_id}/permissions" + "path": "/api/v1/taxes" }, { - "file": "routes/contact_folder_permissions.py", + "file": "routes/taxes.py", "method": "POST", - "path": "/{folder_id}/permissions" - }, - { - "file": "routes/contact_folder_permissions.py", - "method": "PUT", - "path": "/{folder_id}/permissions/{permission_id}" - }, - { - "file": "routes/contact_folder_permissions.py", - "method": "DELETE", - "path": "/{folder_id}/permissions/{permission_id}" - }, - { - "file": "routes/contact_folder_permissions.py", - "method": "GET", - "path": "/{folder_id}/access" + "path": "/api/v1/taxes" }, { "file": "routes/taxes.py", "method": "PATCH", - "path": "/{tax_id}" + "path": "/api/v1/taxes/{tax_id}" }, { "file": "routes/taxes.py", "method": "DELETE", - "path": "/{tax_id}" + "path": "/api/v1/taxes/{tax_id}" + }, + { + "file": "routes/notifications.py", + "method": "GET", + "path": "/api/v1/notifications" }, { "file": "routes/notifications.py", "method": "PATCH", - "path": "/{notification_id}/read" + "path": "/api/v1/notifications/{notification_id}/read" }, { "file": "routes/notifications.py", "method": "GET", - "path": "/unread-count" + "path": "/api/v1/notifications/unread-count" }, { "file": "routes/notifications.py", "method": "GET", - "path": "/types" + "path": "/api/v1/notifications/types" }, { "file": "routes/notifications.py", "method": "GET", - "path": "/preferences" + "path": "/api/v1/notifications/preferences" }, { "file": "routes/notifications.py", "method": "PATCH", - "path": "/preferences/{type_key}" + "path": "/api/v1/notifications/preferences/{type_key}" }, { "file": "routes/import_export.py", "method": "POST", - "path": "/import" + "path": "/api/v1/import" }, { "file": "routes/import_export.py", "method": "POST", - "path": "/import/preview" + "path": "/api/v1/import/preview" }, { "file": "routes/import_export.py", "method": "POST", - "path": "/import/validate" + "path": "/api/v1/import/validate" }, { "file": "routes/import_export.py", "method": "GET", - "path": "/import/status/{job_id}" + "path": "/api/v1/import/status/{job_id}" }, { "file": "routes/import_export.py", "method": "POST", - "path": "/import/contacts" + "path": "/api/v1/import/contacts" }, { "file": "routes/import_export.py", "method": "POST", - "path": "/import/companies" + "path": "/api/v1/import/companies" }, { "file": "routes/import_export.py", "method": "GET", - "path": "/export" + "path": "/api/v1/export" + }, + { + "file": "routes/attachments.py", + "method": "POST", + "path": "/api/v1/attachments" }, { "file": "routes/attachments.py", "method": "GET", - "path": "/{attachment_id}" + "path": "/api/v1/attachments" + }, + { + "file": "routes/attachments.py", + "method": "GET", + "path": "/api/v1/attachments/{attachment_id}" }, { "file": "routes/attachments.py", "method": "DELETE", - "path": "/{attachment_id}" + "path": "/api/v1/attachments/{attachment_id}" }, { "file": "routes/health.py", @@ -3010,162 +3055,182 @@ { "file": "routes/workflows.py", "method": "GET", - "path": "/instances" + "path": "/api/v1/workflows" + }, + { + "file": "routes/workflows.py", + "method": "POST", + "path": "/api/v1/workflows" }, { "file": "routes/workflows.py", "method": "GET", - "path": "/{workflow_id}" + "path": "/api/v1/workflows/instances" + }, + { + "file": "routes/workflows.py", + "method": "GET", + "path": "/api/v1/workflows/{workflow_id}" }, { "file": "routes/workflows.py", "method": "PATCH", - "path": "/{workflow_id}" + "path": "/api/v1/workflows/{workflow_id}" }, { "file": "routes/workflows.py", "method": "DELETE", - "path": "/{workflow_id}" + "path": "/api/v1/workflows/{workflow_id}" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/{workflow_id}/instances" + "path": "/api/v1/workflows/{workflow_id}/instances" }, { "file": "routes/workflows.py", "method": "GET", - "path": "/instances/{instance_id}" + "path": "/api/v1/workflows/instances/{instance_id}" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/instances/{instance_id}/advance" + "path": "/api/v1/workflows/instances/{instance_id}/advance" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/instances/{instance_id}/cancel" + "path": "/api/v1/workflows/instances/{instance_id}/cancel" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/instances/{instance_id}/resume" + "path": "/api/v1/workflows/instances/{instance_id}/resume" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/{workflow_id}/trigger" + "path": "/api/v1/workflows/{workflow_id}/trigger" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/webhook/{token}" + "path": "/api/v1/workflows/webhook/{token}" }, { "file": "routes/workflows.py", "method": "GET", - "path": "/instances/{instance_id}/history" + "path": "/api/v1/workflows/instances/{instance_id}/history" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/instances/{instance_id}/approve" + "path": "/api/v1/workflows/instances/{instance_id}/approve" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/instances/{instance_id}/reject" + "path": "/api/v1/workflows/instances/{instance_id}/reject" }, { "file": "routes/workflows.py", "method": "GET", - "path": "/templates" + "path": "/api/v1/workflows/templates" }, { "file": "routes/workflows.py", "method": "POST", - "path": "/templates/{template_id}/instantiate" + "path": "/api/v1/workflows/templates/{template_id}/instantiate" }, { "file": "routes/outbox.py", "method": "GET", - "path": "/stats" + "path": "/api/v1/outbox/stats" }, { "file": "routes/outbox.py", "method": "GET", - "path": "/failed" + "path": "/api/v1/outbox/failed" }, { "file": "routes/outbox.py", "method": "POST", - "path": "/replay/{event_id}" + "path": "/api/v1/outbox/replay/{event_id}" }, { "file": "routes/outbox.py", "method": "POST", - "path": "/replay-all" + "path": "/api/v1/outbox/replay-all" }, { "file": "routes/outbox.py", "method": "GET", - "path": "/consumer-registry" + "path": "/api/v1/outbox/consumer-registry" }, { "file": "routes/outbox.py", "method": "POST", - "path": "/recover-stuck" + "path": "/api/v1/outbox/recover-stuck" }, { "file": "routes/outbox.py", "method": "POST", - "path": "/cleanup-published" + "path": "/api/v1/outbox/cleanup-published" }, { "file": "routes/system_settings.py", "method": "GET", - "path": "/backup-config" + "path": "/api/v1/system-settings" }, { "file": "routes/system_settings.py", "method": "PUT", - "path": "/backup-config" - }, - { - "file": "routes/system_settings.py", - "method": "POST", - "path": "/backup-now" + "path": "/api/v1/system-settings" }, { "file": "routes/system_settings.py", "method": "GET", - "path": "/backup-history" + "path": "/api/v1/system-settings/backup-config" }, { "file": "routes/system_settings.py", - "method": "GET", - "path": "/dsgvo-export/{user_id}" + "method": "PUT", + "path": "/api/v1/system-settings/backup-config" }, { "file": "routes/system_settings.py", "method": "POST", - "path": "/dsar/{user_id}" + "path": "/api/v1/system-settings/backup-now" + }, + { + "file": "routes/system_settings.py", + "method": "GET", + "path": "/api/v1/system-settings/backup-history" + }, + { + "file": "routes/system_settings.py", + "method": "GET", + "path": "/api/v1/system-settings/dsgvo-export/{user_id}" + }, + { + "file": "routes/system_settings.py", + "method": "POST", + "path": "/api/v1/system-settings/dsar/{user_id}" }, { "file": "routes/ai_copilot.py", "method": "POST", - "path": "/query" + "path": "/api/v1/ai/copilot/query" }, { "file": "routes/ai_copilot.py", "method": "POST", - "path": "/execute" + "path": "/api/v1/ai/copilot/execute" }, { "file": "routes/ai_copilot.py", "method": "GET", - "path": "/history" + "path": "/api/v1/ai/copilot/history" }, { "file": "routes/metrics.py", @@ -3175,1929 +3240,2310 @@ { "file": "routes/entity_history.py", "method": "GET", - "path": "/{entity_type}/{entity_id}" + "path": "/api/v1/entity-history/{entity_type}/{entity_id}" }, { "file": "routes/entity_history.py", "method": "POST", - "path": "/restore" + "path": "/api/v1/entity-history/restore" }, { "file": "routes/entity_history.py", "method": "POST", - "path": "/undo/{entity_type}/{entity_id}" + "path": "/api/v1/entity-history/undo/{entity_type}/{entity_id}" }, { "file": "routes/entity_history.py", "method": "GET", - "path": "/trash" + "path": "/api/v1/entity-history/trash" }, { "file": "routes/entity_history.py", "method": "POST", - "path": "/bulk-restore" + "path": "/api/v1/entity-history/bulk-restore" }, { "file": "routes/entity_history.py", "method": "POST", - "path": "/retention/archive" + "path": "/api/v1/entity-history/retention/archive" }, { "file": "routes/policies.py", "method": "GET", - "path": "/{entity_type}" + "path": "/api/v1/policies/{entity_type}" + }, + { + "file": "routes/policies.py", + "method": "POST", + "path": "/api/v1/policies" }, { "file": "routes/policies.py", "method": "PUT", - "path": "/{policy_id}" + "path": "/api/v1/policies/{policy_id}" }, { "file": "routes/policies.py", "method": "DELETE", - "path": "/{policy_id}" + "path": "/api/v1/policies/{policy_id}" }, { "file": "routes/permission_templates.py", - "method": "PUT", - "path": "/{template_id}" - }, - { - "file": "routes/permission_templates.py", - "method": "DELETE", - "path": "/{template_id}" + "method": "GET", + "path": "/api/v1/permission-templates" }, { "file": "routes/permission_templates.py", "method": "POST", - "path": "/apply" + "path": "/api/v1/permission-templates" + }, + { + "file": "routes/permission_templates.py", + "method": "PUT", + "path": "/api/v1/permission-templates/{template_id}" + }, + { + "file": "routes/permission_templates.py", + "method": "DELETE", + "path": "/api/v1/permission-templates/{template_id}" + }, + { + "file": "routes/permission_templates.py", + "method": "POST", + "path": "/api/v1/permission-templates/apply" + }, + { + "file": "routes/currencies.py", + "method": "GET", + "path": "/api/v1/currencies" + }, + { + "file": "routes/currencies.py", + "method": "POST", + "path": "/api/v1/currencies" }, { "file": "routes/currencies.py", "method": "PATCH", - "path": "/{currency_id}" + "path": "/api/v1/currencies/{currency_id}" }, { "file": "routes/currencies.py", "method": "DELETE", - "path": "/{currency_id}" + "path": "/api/v1/currencies/{currency_id}" }, { "file": "routes/user_preferences.py", "method": "GET", - "path": "/{key}" + "path": "/api/v1/user/preferences" + }, + { + "file": "routes/user_preferences.py", + "method": "GET", + "path": "/api/v1/user/preferences/{key}" }, { "file": "routes/user_preferences.py", "method": "PUT", - "path": "/{key}" + "path": "/api/v1/user/preferences/{key}" }, { "file": "routes/user_preferences.py", "method": "DELETE", - "path": "/{key}" + "path": "/api/v1/user/preferences/{key}" }, { "file": "routes/entity_permissions.py", "method": "GET", - "path": "/{entity_type}/{entity_id}" + "path": "/api/v1/permissions/{entity_type}/{entity_id}" }, { "file": "routes/entity_permissions.py", "method": "POST", - "path": "/{entity_type}/{entity_id}" + "path": "/api/v1/permissions/{entity_type}/{entity_id}" }, { "file": "routes/entity_permissions.py", "method": "PUT", - "path": "/{entity_type}/{entity_id}/{permission_id}" + "path": "/api/v1/permissions/{entity_type}/{entity_id}/{permission_id}" }, { "file": "routes/entity_permissions.py", "method": "DELETE", - "path": "/{entity_type}/{entity_id}/{permission_id}" + "path": "/api/v1/permissions/{entity_type}/{entity_id}/{permission_id}" }, { "file": "routes/entity_permissions.py", "method": "GET", - "path": "/{entity_type}/{entity_id}/access" + "path": "/api/v1/permissions/{entity_type}/{entity_id}/access" }, { "file": "routes/entity_permissions.py", "method": "GET", - "path": "/all" + "path": "/api/v1/permissions/all" }, { "file": "routes/entity_permissions.py", "method": "GET", - "path": "/registry" + "path": "/api/v1/permissions/registry" }, { "file": "routes/entity_permissions.py", "method": "POST", - "path": "/bulk" + "path": "/api/v1/permissions/bulk" }, { "file": "routes/entity_permissions.py", "method": "POST", - "path": "/bulk/unshare" + "path": "/api/v1/permissions/bulk/unshare" }, { "file": "routes/entity_permissions.py", "method": "GET", - "path": "/analytics" + "path": "/api/v1/permissions/analytics" }, { "file": "routes/plugins.py", "method": "GET", - "path": "/manifest" + "path": "/api/v1/plugins" }, { "file": "routes/plugins.py", "method": "GET", - "path": "/updates" + "path": "/api/v1/plugins/manifest" }, { "file": "routes/plugins.py", "method": "GET", - "path": "/active-manifests" + "path": "/api/v1/plugins/updates" }, { "file": "routes/plugins.py", "method": "GET", - "path": "/{name}/config" + "path": "/api/v1/plugins/active-manifests" + }, + { + "file": "routes/plugins.py", + "method": "GET", + "path": "/api/v1/plugins/{name}/config" }, { "file": "routes/plugins.py", "method": "PATCH", - "path": "/{name}/config" + "path": "/api/v1/plugins/{name}/config" }, { "file": "routes/plugins.py", "method": "POST", - "path": "/{name}/install" + "path": "/api/v1/plugins/{name}/install" }, { "file": "routes/plugins.py", "method": "POST", - "path": "/{name}/activate" + "path": "/api/v1/plugins/{name}/activate" }, { "file": "routes/plugins.py", "method": "POST", - "path": "/{name}/deactivate" + "path": "/api/v1/plugins/{name}/deactivate" }, { "file": "routes/plugins.py", "method": "DELETE", - "path": "/{name}" + "path": "/api/v1/plugins/{name}" }, { "file": "routes/plugins.py", "method": "POST", - "path": "/upload" + "path": "/api/v1/plugins/upload" }, { "file": "routes/plugins.py", "method": "POST", - "path": "/install-url" + "path": "/api/v1/plugins/install-url" }, { "file": "routes/plugins.py", "method": "POST", - "path": "/install-marketplace" + "path": "/api/v1/plugins/install-marketplace" }, { "file": "routes/compliance.py", "method": "GET", - "path": "/ai-registry" + "path": "/api/v1/compliance/ai-registry" }, { "file": "routes/compliance.py", "method": "GET", - "path": "/dpia-template" + "path": "/api/v1/compliance/dpia-template" }, { "file": "routes/compliance.py", "method": "GET", - "path": "/incidents" + "path": "/api/v1/compliance/incidents" }, { "file": "routes/compliance.py", "method": "POST", - "path": "/incidents" + "path": "/api/v1/compliance/incidents" }, { "file": "routes/compliance.py", "method": "PATCH", - "path": "/incidents/{incident_id}" + "path": "/api/v1/compliance/incidents/{incident_id}" }, { "file": "routes/compliance.py", "method": "GET", - "path": "/retention-policies" + "path": "/api/v1/compliance/retention-policies" }, { "file": "routes/compliance.py", "method": "PATCH", - "path": "/retention-policies/{key}" + "path": "/api/v1/compliance/retention-policies/{key}" + }, + { + "file": "routes/approvals.py", + "method": "POST", + "path": "/api/v1/approvals" }, { "file": "routes/approvals.py", "method": "GET", - "path": "/{request_id}" + "path": "/api/v1/approvals" + }, + { + "file": "routes/approvals.py", + "method": "GET", + "path": "/api/v1/approvals/{request_id}" }, { "file": "routes/approvals.py", "method": "POST", - "path": "/{request_id}/approve" + "path": "/api/v1/approvals/{request_id}/approve" }, { "file": "routes/approvals.py", "method": "POST", - "path": "/{request_id}/reject" + "path": "/api/v1/approvals/{request_id}/reject" }, { "file": "routes/approvals.py", "method": "POST", - "path": "/{request_id}/expire" + "path": "/api/v1/approvals/{request_id}/expire" }, { "file": "routes/system_dashboard.py", "method": "GET", - "path": "/dashboard" + "path": "/api/v1/system/dashboard" }, { "file": "routes/system_dashboard.py", "method": "GET", - "path": "/alerts" + "path": "/api/v1/system/alerts" }, { "file": "plugins/builtins/mcp_client/routes.py", "method": "GET", - "path": "/servers", + "path": "/api/v1/mcp-client/servers", "is_plugin": true }, { "file": "plugins/builtins/mcp_client/routes.py", "method": "POST", - "path": "/servers", + "path": "/api/v1/mcp-client/servers", "is_plugin": true }, { "file": "plugins/builtins/mcp_client/routes.py", "method": "PATCH", - "path": "/servers/{server_id}", + "path": "/api/v1/mcp-client/servers/{server_id}", "is_plugin": true }, { "file": "plugins/builtins/mcp_client/routes.py", "method": "DELETE", - "path": "/servers/{server_id}", + "path": "/api/v1/mcp-client/servers/{server_id}", "is_plugin": true }, { "file": "plugins/builtins/mcp_client/routes.py", "method": "GET", - "path": "/servers/{server_id}/tools", + "path": "/api/v1/mcp-client/servers/{server_id}/tools", "is_plugin": true }, { "file": "plugins/builtins/mcp_client/routes.py", "method": "POST", - "path": "/servers/{server_id}/execute", + "path": "/api/v1/mcp-client/servers/{server_id}/execute", "is_plugin": true }, { "file": "plugins/builtins/forgejo_error_reporter/routes.py", "method": "GET", - "path": "/status", - "is_plugin": true - }, - { - "file": "plugins/builtins/automation/routes.py", - "method": "POST", - "path": "/", + "path": "/api/v1/forgejo-error-reporter/status", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/runs/recent", - "is_plugin": true - }, - { - "file": "plugins/builtins/automation/routes.py", - "method": "GET", - "path": "/miniapps", + "path": "/api/v1/automation", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/miniapps", + "path": "/api/v1/automation/", + "is_plugin": true + }, + { + "file": "plugins/builtins/automation/routes.py", + "method": "GET", + "path": "/api/v1/automation/runs/recent", + "is_plugin": true + }, + { + "file": "plugins/builtins/automation/routes.py", + "method": "GET", + "path": "/api/v1/automation/miniapps", + "is_plugin": true + }, + { + "file": "plugins/builtins/automation/routes.py", + "method": "POST", + "path": "/api/v1/automation/miniapps", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "DELETE", - "path": "/miniapps/{app_id}", + "path": "/api/v1/automation/miniapps/{app_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/settings", + "path": "/api/v1/automation/settings", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "PATCH", - "path": "/settings", + "path": "/api/v1/automation/settings", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/{automation_id}", + "path": "/api/v1/automation/{automation_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "PATCH", - "path": "/{automation_id}", + "path": "/api/v1/automation/{automation_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "DELETE", - "path": "/{automation_id}", + "path": "/api/v1/automation/{automation_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/{automation_id}/execute", + "path": "/api/v1/automation/{automation_id}/execute", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/{automation_id}/dry-run", + "path": "/api/v1/automation/{automation_id}/dry-run", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/{automation_id}/runs", + "path": "/api/v1/automation/{automation_id}/runs", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/{automation_id}/versions", + "path": "/api/v1/automation/{automation_id}/versions", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/{automation_id}/versions/{version_id}/restore", + "path": "/api/v1/automation/{automation_id}/versions/{version_id}/restore", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/subtasks", + "path": "/api/v1/automation/subtasks", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/subtasks", + "path": "/api/v1/automation/subtasks", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "GET", - "path": "/subtasks/{subtask_id}", + "path": "/api/v1/automation/subtasks/{subtask_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "PATCH", - "path": "/subtasks/{subtask_id}", + "path": "/api/v1/automation/subtasks/{subtask_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/subtasks/{subtask_id}/cancel", + "path": "/api/v1/automation/subtasks/{subtask_id}/cancel", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/subtasks/{subtask_id}/wait", + "path": "/api/v1/automation/subtasks/{subtask_id}/wait", "is_plugin": true }, { "file": "plugins/builtins/automation/routes.py", "method": "POST", - "path": "/subtasks/aggregate", - "is_plugin": true - }, - { - "file": "plugins/builtins/automation/skill_routes.py", - "method": "POST", - "path": "/", + "path": "/api/v1/automation/subtasks/aggregate", "is_plugin": true }, { "file": "plugins/builtins/automation/skill_routes.py", "method": "GET", - "path": "/{skill_id}", + "path": "/api/v1/skills", + "is_plugin": true + }, + { + "file": "plugins/builtins/automation/skill_routes.py", + "method": "POST", + "path": "/api/v1/skills/", + "is_plugin": true + }, + { + "file": "plugins/builtins/automation/skill_routes.py", + "method": "GET", + "path": "/api/v1/skills/{skill_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/skill_routes.py", "method": "PATCH", - "path": "/{skill_id}", + "path": "/api/v1/skills/{skill_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/skill_routes.py", "method": "DELETE", - "path": "/{skill_id}", + "path": "/api/v1/skills/{skill_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/automation/agent_routes.py", + "method": "GET", + "path": "/api/v1/agents", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "POST", - "path": "/", + "path": "/api/v1/agents/", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "GET", - "path": "/tools", + "path": "/api/v1/agents/tools", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "GET", - "path": "/runs/recent", + "path": "/api/v1/agents/runs/recent", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "GET", - "path": "/{agent_id}", + "path": "/api/v1/agents/{agent_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "PATCH", - "path": "/{agent_id}", + "path": "/api/v1/agents/{agent_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "GET", - "path": "/{agent_id}/ai-use-case", + "path": "/api/v1/agents/{agent_id}/ai-use-case", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "PATCH", - "path": "/{agent_id}/ai-use-case", + "path": "/api/v1/agents/{agent_id}/ai-use-case", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "DELETE", - "path": "/{agent_id}", + "path": "/api/v1/agents/{agent_id}", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "POST", - "path": "/{agent_id}/execute", + "path": "/api/v1/agents/{agent_id}/execute", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "POST", - "path": "/{agent_id}/test-run", + "path": "/api/v1/agents/{agent_id}/test-run", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "GET", - "path": "/{agent_id}/runs", + "path": "/api/v1/agents/{agent_id}/runs", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "GET", - "path": "/{agent_id}/versions", + "path": "/api/v1/agents/{agent_id}/versions", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "POST", - "path": "/{agent_id}/versions/{version_id}/restore", + "path": "/api/v1/agents/{agent_id}/versions/{version_id}/restore", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "POST", - "path": "/{id}/send-message", + "path": "/api/v1/agents/{id}/send-message", "is_plugin": true }, { "file": "plugins/builtins/automation/agent_routes.py", "method": "POST", - "path": "/{id}/stream", + "path": "/api/v1/agents/{id}/stream", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/folders", + "path": "/api/v1/dms/folders", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/folders", + "path": "/api/v1/dms/folders", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "PATCH", - "path": "/folders/{folder_id}", + "path": "/api/v1/dms/folders/{folder_id}", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "DELETE", - "path": "/folders/{folder_id}", + "path": "/api/v1/dms/folders/{folder_id}", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/files/upload", + "path": "/api/v1/dms/files/upload", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/files/{file_id}", + "path": "/api/v1/dms/files/{file_id}", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/files", + "path": "/api/v1/dms/files", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/folders/{folder_id}/files", + "path": "/api/v1/dms/folders/{folder_id}/files", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "PATCH", - "path": "/files/{file_id}", + "path": "/api/v1/dms/files/{file_id}", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "DELETE", - "path": "/files/{file_id}", + "path": "/api/v1/dms/files/{file_id}", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/files/{file_id}/restore", + "path": "/api/v1/dms/files/{file_id}/restore", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/files/{file_id}/preview", + "path": "/api/v1/dms/files/{file_id}/preview", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/files/{file_id}/download", + "path": "/api/v1/dms/files/{file_id}/download", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/files/{file_id}/edit-session", + "path": "/api/v1/dms/files/{file_id}/edit-session", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/files/{file_id}/share", + "path": "/api/v1/dms/files/{file_id}/share", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "DELETE", - "path": "/files/{file_id}/share", + "path": "/api/v1/dms/files/{file_id}/share", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/search", + "path": "/api/v1/dms/search", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "GET", - "path": "/shared-with-me", + "path": "/api/v1/dms/shared-with-me", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/files/bulk-move", + "path": "/api/v1/dms/files/bulk-move", "is_plugin": true }, { "file": "plugins/builtins/dms/routes.py", "method": "POST", - "path": "/files/bulk-delete", + "path": "/api/v1/dms/files/bulk-delete", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/accounts", + "path": "/api/v1/mail/accounts", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/accounts", + "path": "/api/v1/mail/accounts", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/accounts/shared", + "path": "/api/v1/mail/accounts/shared", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "PATCH", - "path": "/accounts/{account_id}", + "path": "/api/v1/mail/accounts/{account_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "DELETE", - "path": "/accounts/{account_id}", + "path": "/api/v1/mail/accounts/{account_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/accounts/{account_id}/users", + "path": "/api/v1/mail/accounts/{account_id}/users", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/accounts/{account_id}/delegates", + "path": "/api/v1/mail/accounts/{account_id}/delegates", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/accounts/{account_id}/send-permissions", + "path": "/api/v1/mail/accounts/{account_id}/send-permissions", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/accounts/{account_id}/test-connection", + "path": "/api/v1/mail/accounts/{account_id}/test-connection", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/accounts/{account_id}/sync", + "path": "/api/v1/mail/accounts/{account_id}/sync", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/folders", + "path": "/api/v1/mail/folders", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/folders", + "path": "/api/v1/mail/folders", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "PATCH", - "path": "/folders/{folder_id}", + "path": "/api/v1/mail/folders/{folder_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "DELETE", - "path": "/folders/{folder_id}", + "path": "/api/v1/mail/folders/{folder_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/folders/{folder_id}/empty", + "path": "/api/v1/mail/folders/{folder_id}/empty", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/folders/{folder_id}/sync", + "path": "/api/v1/mail/folders/{folder_id}/sync", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/upload-attachment", + "path": "/api/v1/mail/upload-attachment", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/send", + "path": "/api/v1/mail/send", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/search", + "path": "/api/v1/mail/search", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/threads", + "path": "/api/v1/mail/threads", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/templates", + "path": "/api/v1/mail/templates", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/templates", + "path": "/api/v1/mail/templates", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/templates/substitute", + "path": "/api/v1/mail/templates/substitute", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/signatures", + "path": "/api/v1/mail/signatures", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/signatures", + "path": "/api/v1/mail/signatures", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/rules", + "path": "/api/v1/mail/rules", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/rules", + "path": "/api/v1/mail/rules", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "DELETE", - "path": "/rules/{rule_id}", + "path": "/api/v1/mail/rules/{rule_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/vacation", + "path": "/api/v1/mail/vacation", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/vacation/test-dedup", + "path": "/api/v1/mail/vacation/test-dedup", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/pgp/keys", + "path": "/api/v1/mail/pgp/keys", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/pgp/keys", + "path": "/api/v1/mail/pgp/keys", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/pgp/encrypt", + "path": "/api/v1/mail/pgp/encrypt", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/labels", + "path": "/api/v1/mail/labels", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/labels", + "path": "/api/v1/mail/labels", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/contacts/{contact_id}/pgp-key", + "path": "/api/v1/mail/contacts/{contact_id}/pgp-key", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/apply-rules", + "path": "/api/v1/mail/{mail_id}/apply-rules", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/reply", + "path": "/api/v1/mail/{mail_id}/reply", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/forward", + "path": "/api/v1/mail/{mail_id}/forward", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "PATCH", - "path": "/{mail_id}/flags", + "path": "/api/v1/mail/{mail_id}/flags", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/{mail_id}/attachments/{att_id}", + "path": "/api/v1/mail/{mail_id}/attachments/{att_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/link", + "path": "/api/v1/mail/{mail_id}/link", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/create-event", + "path": "/api/v1/mail/{mail_id}/create-event", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/labels", + "path": "/api/v1/mail/{mail_id}/labels", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/drafts", + "path": "/api/v1/mail/drafts", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "PUT", - "path": "/drafts/{mail_id}", + "path": "/api/v1/mail/drafts/{mail_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "DELETE", - "path": "/{mail_id}", + "path": "/api/v1/mail/{mail_id}", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "POST", - "path": "/{mail_id}/move", + "path": "/api/v1/mail/{mail_id}/move", "is_plugin": true }, { "file": "plugins/builtins/mail/routes.py", "method": "GET", - "path": "/{mail_id}", + "path": "/api/v1/mail", + "is_plugin": true + }, + { + "file": "plugins/builtins/mail/routes.py", + "method": "GET", + "path": "/api/v1/mail/{mail_id}", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "GET", - "path": "/articles", + "path": "/api/v1/wiki/articles", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "POST", - "path": "/articles", + "path": "/api/v1/wiki/articles", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "GET", - "path": "/articles/{article_id}", + "path": "/api/v1/wiki/articles/{article_id}", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "PATCH", - "path": "/articles/{article_id}", + "path": "/api/v1/wiki/articles/{article_id}", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "DELETE", - "path": "/articles/{article_id}", + "path": "/api/v1/wiki/articles/{article_id}", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "GET", - "path": "/articles/{article_id}/versions", + "path": "/api/v1/wiki/articles/{article_id}/versions", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "POST", - "path": "/articles/{article_id}/versions/{version}/restore", + "path": "/api/v1/wiki/articles/{article_id}/versions/{version}/restore", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "GET", - "path": "/categories", + "path": "/api/v1/wiki/categories", "is_plugin": true }, { "file": "plugins/builtins/wiki/routes.py", "method": "POST", - "path": "/categories", + "path": "/api/v1/wiki/categories", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "GET", + "path": "/api/v1/contacts", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "GET", + "path": "/api/v1/contacts/export", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "POST", + "path": "/api/v1/contacts", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "GET", + "path": "/api/v1/contacts/merge-history", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "GET", + "path": "/api/v1/contacts/{contact_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "PUT", + "path": "/api/v1/contacts/{contact_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "DELETE", + "path": "/api/v1/contacts/{contact_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "GET", + "path": "/api/v1/contacts/{contact_id}/persons", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "POST", + "path": "/api/v1/contacts/{contact_id}/persons", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "PUT", + "path": "/api/v1/contacts/{contact_id}/persons/{person_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "DELETE", + "path": "/api/v1/contacts/{contact_id}/persons/{person_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "POST", + "path": "/api/v1/contacts/duplicates", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/routes.py", + "method": "POST", + "path": "/api/v1/contacts/merge", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_routes.py", + "method": "GET", + "path": "/api/v1/contact-folders", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_routes.py", + "method": "POST", + "path": "/api/v1/contact-folders", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_routes.py", + "method": "PUT", + "path": "/api/v1/contact-folders/{folder_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_routes.py", + "method": "DELETE", + "path": "/api/v1/contact-folders/{folder_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_routes.py", + "method": "PUT", + "path": "/api/v1/contact-folders/{folder_id}/reorder", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_routes.py", + "method": "PUT", + "path": "/api/v1/contact-folders/contacts/{contact_id}/move", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_permission_routes.py", + "method": "GET", + "path": "/api/v1/contact-folders/{folder_id}/permissions", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_permission_routes.py", + "method": "POST", + "path": "/api/v1/contact-folders/{folder_id}/permissions", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_permission_routes.py", + "method": "PUT", + "path": "/api/v1/contact-folders/{folder_id}/permissions/{permission_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_permission_routes.py", + "method": "DELETE", + "path": "/api/v1/contact-folders/{folder_id}/permissions/{permission_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/folder_permission_routes.py", + "method": "GET", + "path": "/api/v1/contact-folders/{folder_id}/access", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "GET", + "path": "/api/v1/companies", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "POST", + "path": "/api/v1/companies", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "GET", + "path": "/api/v1/companies/export", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "GET", + "path": "/api/v1/companies/{company_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "PUT", + "path": "/api/v1/companies/{company_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "DELETE", + "path": "/api/v1/companies/{company_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "POST", + "path": "/api/v1/companies/{company_id}/contacts/{contact_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "DELETE", + "path": "/api/v1/companies/{company_id}/contacts/{contact_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/contacts/company_routes.py", + "method": "GET", + "path": "/api/v1/companies/{company_id}/emails", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "GET", - "path": "/{task_id}", + "path": "/api/v1/tasks", + "is_plugin": true + }, + { + "file": "plugins/builtins/tasks/routes.py", + "method": "POST", + "path": "/api/v1/tasks", + "is_plugin": true + }, + { + "file": "plugins/builtins/tasks/routes.py", + "method": "GET", + "path": "/api/v1/tasks/{task_id}", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "PATCH", - "path": "/{task_id}", + "path": "/api/v1/tasks/{task_id}", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "DELETE", - "path": "/{task_id}", + "path": "/api/v1/tasks/{task_id}", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "POST", - "path": "/{task_id}/assign", + "path": "/api/v1/tasks/{task_id}/assign", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "POST", - "path": "/{task_id}/status", + "path": "/api/v1/tasks/{task_id}/status", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "POST", - "path": "/{task_id}/subtasks", + "path": "/api/v1/tasks/{task_id}/subtasks", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "GET", - "path": "/{task_id}/subtasks", + "path": "/api/v1/tasks/{task_id}/subtasks", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "POST", - "path": "/{task_id}/dependencies", + "path": "/api/v1/tasks/{task_id}/dependencies", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "DELETE", - "path": "/{task_id}/dependencies/{depends_on}", + "path": "/api/v1/tasks/{task_id}/dependencies/{depends_on}", "is_plugin": true }, { "file": "plugins/builtins/tasks/routes.py", "method": "POST", - "path": "/{task_id}/decompose", + "path": "/api/v1/tasks/{task_id}/decompose", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "GET", - "path": "/calendar/entries", + "path": "/api/v1/calendars", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "POST", - "path": "/calendar/entries", - "is_plugin": true - }, - { - "file": "plugins/builtins/calendar/routes.py", - "method": "GET", - "path": "/calendar/entries/export", - "is_plugin": true - }, - { - "file": "plugins/builtins/calendar/routes.py", - "method": "GET", - "path": "/calendar/entries/{entry_id}", + "path": "/api/v1/calendars", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "PATCH", - "path": "/calendar/entries/{entry_id}", + "path": "/api/v1/calendars/{calendar_id}", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "DELETE", - "path": "/calendar/entries/{entry_id}", + "path": "/api/v1/calendars/{calendar_id}", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "POST", - "path": "/calendar/entries/{entry_id}/link", + "path": "/api/v1/calendars/{calendar_id}/share", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "GET", + "path": "/api/v1/calendars/{calendar_id}/permissions", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "GET", + "path": "/api/v1/calendar/entries", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "POST", - "path": "/calendar/entries/{entry_id}/subtasks", + "path": "/api/v1/calendar/entries", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "GET", + "path": "/api/v1/calendar/entries/export", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "GET", + "path": "/api/v1/calendar/entries/{entry_id}", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "PATCH", - "path": "/calendar/entries/{entry_id}/subtasks/{sub_id}", + "path": "/api/v1/calendar/entries/{entry_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "DELETE", + "path": "/api/v1/calendar/entries/{entry_id}", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "POST", - "path": "/calendar/entries/bulk", - "is_plugin": true - }, - { - "file": "plugins/builtins/calendar/routes.py", - "method": "GET", - "path": "/calendar/kanban", - "is_plugin": true - }, - { - "file": "plugins/builtins/calendar/routes.py", - "method": "GET", - "path": "/calendar/{calendar_id}/ics-feed", + "path": "/api/v1/calendar/entries/{entry_id}/link", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "POST", - "path": "/calendar/import", + "path": "/api/v1/calendar/entries/{entry_id}/subtasks", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "PATCH", + "path": "/api/v1/calendar/entries/{entry_id}/subtasks/{sub_id}", "is_plugin": true }, { "file": "plugins/builtins/calendar/routes.py", "method": "POST", - "path": "/calendar/entries/{entry_id}/book-resource", + "path": "/api/v1/calendar/entries/bulk", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "GET", + "path": "/api/v1/calendar/kanban", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "GET", + "path": "/api/v1/calendar/{calendar_id}/ics-feed", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "POST", + "path": "/api/v1/calendar/import", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "POST", + "path": "/api/v1/resources", + "is_plugin": true + }, + { + "file": "plugins/builtins/calendar/routes.py", + "method": "POST", + "path": "/api/v1/calendar/entries/{entry_id}/book-resource", "is_plugin": true }, { "file": "plugins/builtins/unified_search/routes.py", "method": "GET", - "path": "/facets", + "path": "/api/v1/search", + "is_plugin": true + }, + { + "file": "plugins/builtins/unified_search/routes.py", + "method": "POST", + "path": "/api/v1/search", "is_plugin": true }, { "file": "plugins/builtins/unified_search/routes.py", "method": "GET", - "path": "/suggest", - "is_plugin": true - }, - { - "file": "plugins/builtins/unified_search/routes.py", - "method": "POST", - "path": "/similar", - "is_plugin": true - }, - { - "file": "plugins/builtins/unified_search/routes.py", - "method": "POST", - "path": "/reindex", - "is_plugin": true - }, - { - "file": "plugins/builtins/unified_search/routes.py", - "method": "POST", - "path": "/rebuild/{entity_type}/{entity_id}", - "is_plugin": true - }, - { - "file": "plugins/builtins/unified_search/routes.py", - "method": "POST", - "path": "/purge/{entity_type}/{entity_id}", + "path": "/api/v1/search/facets", "is_plugin": true }, { "file": "plugins/builtins/unified_search/routes.py", "method": "GET", - "path": "/providers", + "path": "/api/v1/search/suggest", "is_plugin": true }, { "file": "plugins/builtins/unified_search/routes.py", "method": "POST", - "path": "/providers/{entity_type}/toggle", + "path": "/api/v1/search/similar", + "is_plugin": true + }, + { + "file": "plugins/builtins/unified_search/routes.py", + "method": "POST", + "path": "/api/v1/search/reindex", + "is_plugin": true + }, + { + "file": "plugins/builtins/unified_search/routes.py", + "method": "POST", + "path": "/api/v1/search/rebuild/{entity_type}/{entity_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/unified_search/routes.py", + "method": "POST", + "path": "/api/v1/search/purge/{entity_type}/{entity_id}", "is_plugin": true }, { "file": "plugins/builtins/unified_search/routes.py", "method": "GET", - "path": "/stats", + "path": "/api/v1/search/providers", + "is_plugin": true + }, + { + "file": "plugins/builtins/unified_search/routes.py", + "method": "POST", + "path": "/api/v1/search/providers/{entity_type}/toggle", + "is_plugin": true + }, + { + "file": "plugins/builtins/unified_search/routes.py", + "method": "GET", + "path": "/api/v1/search/stats", + "is_plugin": true + }, + { + "file": "plugins/builtins/agent_memory/routes.py", + "method": "POST", + "path": "/api/v1/agent-memory", "is_plugin": true }, { "file": "plugins/builtins/agent_memory/routes.py", "method": "GET", - "path": "/search", + "path": "/api/v1/agent-memory", + "is_plugin": true + }, + { + "file": "plugins/builtins/agent_memory/routes.py", + "method": "GET", + "path": "/api/v1/agent-memory/search", "is_plugin": true }, { "file": "plugins/builtins/agent_memory/routes.py", "method": "PATCH", - "path": "/{memory_id}", + "path": "/api/v1/agent-memory/{memory_id}", "is_plugin": true }, { "file": "plugins/builtins/agent_memory/routes.py", "method": "DELETE", - "path": "/{memory_id}", + "path": "/api/v1/agent-memory/{memory_id}", "is_plugin": true }, { "file": "plugins/builtins/marketplace/routes.py", "method": "GET", - "path": "/listings", + "path": "/api/v1/marketplace/listings", "is_plugin": true }, { "file": "plugins/builtins/marketplace/routes.py", "method": "GET", - "path": "/listings/{name}", + "path": "/api/v1/marketplace/listings/{name}", "is_plugin": true }, { "file": "plugins/builtins/marketplace/routes.py", "method": "POST", - "path": "/install/{name}", + "path": "/api/v1/marketplace/install/{name}", "is_plugin": true }, { "file": "plugins/builtins/marketplace/routes.py", "method": "POST", - "path": "/verify/{name}", + "path": "/api/v1/marketplace/verify/{name}", "is_plugin": true }, { "file": "plugins/builtins/marketplace/routes.py", "method": "GET", - "path": "/categories", + "path": "/api/v1/marketplace/categories", "is_plugin": true }, { "file": "plugins/builtins/graph_rag/routes.py", "method": "POST", - "path": "/relationships", + "path": "/api/v1/graph/relationships", "is_plugin": true }, { "file": "plugins/builtins/graph_rag/routes.py", "method": "GET", - "path": "/relationships", + "path": "/api/v1/graph/relationships", "is_plugin": true }, { "file": "plugins/builtins/graph_rag/routes.py", "method": "POST", - "path": "/traverse", + "path": "/api/v1/graph/traverse", "is_plugin": true }, { "file": "plugins/builtins/graph_rag/routes.py", "method": "DELETE", - "path": "/relationships/{relationship_id}", + "path": "/api/v1/graph/relationships/{relationship_id}", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "GET", - "path": "/presets", + "path": "/api/v1/reports/presets", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "POST", - "path": "/presets/generate", + "path": "/api/v1/reports/presets/generate", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "GET", - "path": "/templates", + "path": "/api/v1/reports/templates", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "POST", - "path": "/templates", + "path": "/api/v1/reports/templates", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "GET", - "path": "/templates/{template_id}", + "path": "/api/v1/reports/templates/{template_id}", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "PUT", - "path": "/templates/{template_id}", + "path": "/api/v1/reports/templates/{template_id}", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "DELETE", - "path": "/templates/{template_id}", + "path": "/api/v1/reports/templates/{template_id}", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "POST", - "path": "/generate", + "path": "/api/v1/reports/generate", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "POST", - "path": "/generate/async", + "path": "/api/v1/reports/generate/async", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "GET", - "path": "/{report_id}", + "path": "/api/v1/reports/{report_id}", "is_plugin": true }, { "file": "plugins/builtins/report_generator/routes.py", "method": "GET", - "path": "/{report_id}/download", + "path": "/api/v1/reports/{report_id}/download", "is_plugin": true }, { "file": "plugins/builtins/knowledge/routes.py", "method": "POST", - "path": "/extract", + "path": "/api/v1/knowledge/extract", "is_plugin": true }, { "file": "plugins/builtins/knowledge/routes.py", "method": "POST", - "path": "/ask", + "path": "/api/v1/knowledge/ask", "is_plugin": true }, { "file": "plugins/builtins/knowledge/routes.py", "method": "GET", - "path": "/review", + "path": "/api/v1/knowledge/review", "is_plugin": true }, { "file": "plugins/builtins/knowledge/routes.py", "method": "POST", - "path": "/review/{extraction_id}", + "path": "/api/v1/knowledge/review/{extraction_id}", "is_plugin": true }, { "file": "plugins/builtins/entity_links/routes.py", "method": "POST", - "path": "/files/{file_id}/link", + "path": "/api/v1/entity-links/files/{file_id}/link", "is_plugin": true }, { "file": "plugins/builtins/entity_links/routes.py", "method": "DELETE", - "path": "/files/{file_id}/link", + "path": "/api/v1/entity-links/files/{file_id}/link", "is_plugin": true }, { "file": "plugins/builtins/entity_links/routes.py", "method": "GET", - "path": "/files/{file_id}/links", + "path": "/api/v1/entity-links/files/{file_id}/links", + "is_plugin": true + }, + { + "file": "plugins/builtins/entity_links/routes.py", + "method": "GET", + "path": "/api/v1/contacts/{contact_id}/files", + "is_plugin": true + }, + { + "file": "plugins/builtins/entity_links/routes.py", + "method": "GET", + "path": "/api/v1/companies/{company_id}/files", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "GET", - "path": "/conversations", + "path": "/api/v1/comm/conversations", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations", + "path": "/api/v1/comm/conversations", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "GET", - "path": "/conversations/{conversation_id}", + "path": "/api/v1/comm/conversations/{conversation_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "PATCH", - "path": "/conversations/{conversation_id}", + "path": "/api/v1/comm/conversations/{conversation_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "DELETE", - "path": "/conversations/{conversation_id}", + "path": "/api/v1/comm/conversations/{conversation_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/pin", + "path": "/api/v1/comm/conversations/{conversation_id}/pin", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "DELETE", - "path": "/conversations/{conversation_id}/pin", + "path": "/api/v1/comm/conversations/{conversation_id}/pin", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/mute", + "path": "/api/v1/comm/conversations/{conversation_id}/mute", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "DELETE", - "path": "/conversations/{conversation_id}/mute", + "path": "/api/v1/comm/conversations/{conversation_id}/mute", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/participants", + "path": "/api/v1/comm/conversations/{conversation_id}/participants", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "DELETE", - "path": "/conversations/{conversation_id}/participants/{participant_id}", + "path": "/api/v1/comm/conversations/{conversation_id}/participants/{participant_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "PATCH", - "path": "/conversations/{conversation_id}/participants/{participant_id}", + "path": "/api/v1/comm/conversations/{conversation_id}/participants/{participant_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "GET", - "path": "/conversations/{conversation_id}/messages", + "path": "/api/v1/comm/conversations/{conversation_id}/messages", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/messages", + "path": "/api/v1/comm/conversations/{conversation_id}/messages", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "PATCH", - "path": "/messages/{message_id}", + "path": "/api/v1/comm/messages/{message_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "DELETE", - "path": "/messages/{message_id}", + "path": "/api/v1/comm/messages/{message_id}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/messages/{message_id}/attachments", + "path": "/api/v1/comm/messages/{message_id}/attachments", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/messages/{message_id}/reactions", + "path": "/api/v1/comm/messages/{message_id}/reactions", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "DELETE", - "path": "/messages/{message_id}/reactions/{emoji}", + "path": "/api/v1/comm/messages/{message_id}/reactions/{emoji}", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/read", + "path": "/api/v1/comm/conversations/{conversation_id}/read", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "GET", - "path": "/miniapps", + "path": "/api/v1/comm/miniapps", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/miniapps", + "path": "/api/v1/comm/conversations/{conversation_id}/miniapps", "is_plugin": true }, { "file": "plugins/builtins/kommunikation/routes.py", "method": "GET", - "path": "/block-types", + "path": "/api/v1/comm/block-types", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "POST", - "path": "/context", + "path": "/api/v1/ai-proactive/context", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "GET", - "path": "/suggestions", + "path": "/api/v1/ai-proactive/suggestions", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "POST", - "path": "/suggestions/{suggestion_id}/dismiss", + "path": "/api/v1/ai-proactive/suggestions/{suggestion_id}/dismiss", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "POST", - "path": "/suggestions/{suggestion_id}/act", + "path": "/api/v1/ai-proactive/suggestions/{suggestion_id}/act", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "GET", - "path": "/suggestions/stream", + "path": "/api/v1/ai-proactive/suggestions/stream", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "GET", - "path": "/settings", + "path": "/api/v1/ai-proactive/settings", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "PUT", - "path": "/settings", + "path": "/api/v1/ai-proactive/settings", "is_plugin": true }, { "file": "plugins/builtins/ai_proactive/routes.py", "method": "GET", - "path": "/stats", + "path": "/api/v1/ai-proactive/stats", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/external_api.py", "method": "POST", - "path": "/{agent_id}/run", + "path": "/api/v1/external/agent/{agent_id}/run", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/external_api.py", "method": "GET", - "path": "/{agent_id}/status", + "path": "/api/v1/external/agent/{agent_id}/status", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/external_api.py", "method": "POST", - "path": "/{agent_id}/stream", + "path": "/api/v1/external/agent/{agent_id}/stream", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/providers", + "path": "/api/v1/ai/providers", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "POST", - "path": "/providers", + "path": "/api/v1/ai/providers", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "PUT", - "path": "/providers/{provider_id}", + "path": "/api/v1/ai/providers/{provider_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "DELETE", - "path": "/providers/{provider_id}", + "path": "/api/v1/ai/providers/{provider_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/models", + "path": "/api/v1/ai/models", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "POST", - "path": "/models", + "path": "/api/v1/ai/models", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "PUT", - "path": "/models/{model_id}", + "path": "/api/v1/ai/models/{model_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "DELETE", - "path": "/models/{model_id}", + "path": "/api/v1/ai/models/{model_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/presets", + "path": "/api/v1/ai/presets", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "POST", - "path": "/presets", + "path": "/api/v1/ai/presets", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "PUT", - "path": "/presets/{preset_id}", + "path": "/api/v1/ai/presets/{preset_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "DELETE", - "path": "/presets/{preset_id}", + "path": "/api/v1/ai/presets/{preset_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/agents", + "path": "/api/v1/ai/agents", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "POST", - "path": "/agents", + "path": "/api/v1/ai/agents", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "PUT", - "path": "/agents/{agent_id}", + "path": "/api/v1/ai/agents/{agent_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "DELETE", - "path": "/agents/{agent_id}", + "path": "/api/v1/ai/agents/{agent_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/tools", + "path": "/api/v1/ai/tools", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/folders", + "path": "/api/v1/ai/folders", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "POST", - "path": "/folders", + "path": "/api/v1/ai/folders", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "PUT", - "path": "/folders/{folder_id}", + "path": "/api/v1/ai/folders/{folder_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "DELETE", - "path": "/folders/{folder_id}", + "path": "/api/v1/ai/folders/{folder_id}", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "POST", - "path": "/conversations/{conversation_id}/stream", + "path": "/api/v1/ai/conversations/{conversation_id}/stream", "is_plugin": true }, { "file": "plugins/builtins/ai_assistant/routes.py", "method": "GET", - "path": "/conversations/{conversation_id}/messages", + "path": "/api/v1/ai/conversations/{conversation_id}/messages", + "is_plugin": true + }, + { + "file": "plugins/builtins/tags/routes.py", + "method": "GET", + "path": "/api/v1/tags", + "is_plugin": true + }, + { + "file": "plugins/builtins/tags/routes.py", + "method": "POST", + "path": "/api/v1/tags", "is_plugin": true }, { "file": "plugins/builtins/tags/routes.py", "method": "PATCH", - "path": "/{tag_id}", + "path": "/api/v1/tags/{tag_id}", "is_plugin": true }, { "file": "plugins/builtins/tags/routes.py", "method": "POST", - "path": "/assign", + "path": "/api/v1/tags/assign", "is_plugin": true }, { "file": "plugins/builtins/tags/routes.py", "method": "DELETE", - "path": "/assign", + "path": "/api/v1/tags/assign", "is_plugin": true }, { "file": "plugins/builtins/tags/routes.py", "method": "DELETE", - "path": "/{tag_id}", + "path": "/api/v1/tags/{tag_id}", "is_plugin": true }, { "file": "plugins/builtins/tags/routes.py", "method": "POST", - "path": "/bulk-assign", + "path": "/api/v1/tags/bulk-assign", "is_plugin": true }, { "file": "plugins/builtins/tags/routes.py", "method": "GET", - "path": "/{tag_id}/entities", + "path": "/api/v1/tags/{tag_id}/entities", "is_plugin": true }, { "file": "plugins/builtins/permissions/routes.py", "method": "GET", - "path": "/files/{file_id}/permissions", + "path": "/api/v1/permissions/files/{file_id}/permissions", "is_plugin": true }, { "file": "plugins/builtins/permissions/routes.py", "method": "POST", - "path": "/files/{file_id}/permissions", + "path": "/api/v1/permissions/files/{file_id}/permissions", "is_plugin": true }, { "file": "plugins/builtins/permissions/routes.py", "method": "DELETE", - "path": "/files/{file_id}/permissions/{user_id}", + "path": "/api/v1/permissions/files/{file_id}/permissions/{user_id}", "is_plugin": true }, { "file": "plugins/builtins/permissions/routes.py", "method": "POST", - "path": "/files/{file_id}/share-link", + "path": "/api/v1/permissions/files/{file_id}/share-link", "is_plugin": true }, { "file": "plugins/builtins/permissions/routes.py", "method": "DELETE", - "path": "/share-links/{link_id}", + "path": "/api/v1/permissions/share-links/{link_id}", + "is_plugin": true + }, + { + "file": "plugins/builtins/permissions/routes.py", + "method": "GET", + "path": "/api/public/share/{token}", + "is_plugin": true + }, + { + "file": "plugins/builtins/permissions/routes.py", + "method": "POST", + "path": "/api/public/share/{token}", "is_plugin": true }, { "file": "plugins/builtins/permissions/public_routes.py", "method": "GET", - "path": "/{token}", + "path": "/api/v1/public/share/{token}", "is_plugin": true }, { "file": "plugins/builtins/permissions/public_routes.py", "method": "POST", - "path": "/{token}/verify", + "path": "/api/v1/public/share/{token}/verify", "is_plugin": true }, { "file": "plugins/builtins/permissions/public_routes.py", "method": "GET", - "path": "/{token}/download", + "path": "/api/v1/public/share/{token}/download", "is_plugin": true }, { "file": "plugins/builtins/mcp_server/routes.py", "method": "GET", - "path": "/tools", + "path": "/api/v1/mcp/tools", "is_plugin": true }, { "file": "plugins/builtins/mcp_server/routes.py", "method": "POST", - "path": "/tools/{tool_name}/execute", + "path": "/api/v1/mcp/tools/{tool_name}/execute", "is_plugin": true }, { "file": "plugins/builtins/mcp_server/routes.py", "method": "GET", - "path": "/config", + "path": "/api/v1/mcp/config", "is_plugin": true }, { "file": "plugins/builtins/ai_ui_control/routes.py", "method": "POST", - "path": "/command", + "path": "/api/v1/ai-ui-control/command", "is_plugin": true }, { "file": "plugins/builtins/ai_ui_control/routes.py", "method": "GET", - "path": "/command/{command_id}/status", + "path": "/api/v1/ai-ui-control/command/{command_id}/status", "is_plugin": true }, { "file": "plugins/builtins/ai_ui_control/routes.py", "method": "GET", - "path": "/online-users", + "path": "/api/v1/ai-ui-control/online-users", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/signals/collect", + "path": "/api/v1/improvement/signals/collect", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "GET", - "path": "/signals", + "path": "/api/v1/improvement/signals", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/patterns/detect", + "path": "/api/v1/improvement/patterns/detect", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "GET", - "path": "/patterns", + "path": "/api/v1/improvement/patterns", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/proposals", + "path": "/api/v1/improvement/proposals", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "GET", - "path": "/proposals", + "path": "/api/v1/improvement/proposals", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "GET", - "path": "/proposals/{proposal_id}", + "path": "/api/v1/improvement/proposals/{proposal_id}", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/proposals/{proposal_id}/evaluate", + "path": "/api/v1/improvement/proposals/{proposal_id}/evaluate", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/proposals/{proposal_id}/request-approval", + "path": "/api/v1/improvement/proposals/{proposal_id}/request-approval", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/proposals/{proposal_id}/activate", + "path": "/api/v1/improvement/proposals/{proposal_id}/activate", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/proposals/{proposal_id}/rollback", + "path": "/api/v1/improvement/proposals/{proposal_id}/rollback", "is_plugin": true }, { "file": "plugins/builtins/self_improvement/routes.py", "method": "POST", - "path": "/proposals/{proposal_id}/measure", + "path": "/api/v1/improvement/proposals/{proposal_id}/measure", "is_plugin": true } ], @@ -5110,86 +5556,6 @@ "severity": "HIGH", "message": "Frontend calls GET /webhooks{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/webhooks/{param}", - "file": "api/webhooks.ts", - "severity": "HIGH", - "message": "Frontend calls GET /webhooks/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/webhooks", - "file": "api/webhooks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /webhooks but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/webhooks/{param}/test", - "file": "api/webhooks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /webhooks/{param}/test but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/webhooks/{param}", - "file": "api/webhooks.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /webhooks/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/webhooks/{param}", - "file": "api/webhooks.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /webhooks/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/notifications/unread-count", - "file": "api/notifications.ts", - "severity": "HIGH", - "message": "Frontend calls GET /notifications/unread-count but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/notifications/types", - "file": "api/notifications.ts", - "severity": "HIGH", - "message": "Frontend calls GET /notifications/types but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/notifications/preferences", - "file": "api/notifications.ts", - "severity": "HIGH", - "message": "Frontend calls GET /notifications/preferences but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/notifications/{param}/read", - "file": "api/notifications.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /notifications/{param}/read but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/notifications/preferences/{param}", - "file": "api/notifications.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /notifications/preferences/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "DELETE", @@ -5198,22 +5564,6 @@ "severity": "HIGH", "message": "Frontend calls DELETE /notifications/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/calendars", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls GET /calendars but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/calendars/{param}/permissions", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls GET /calendars/{param}/permissions but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -5222,526 +5572,6 @@ "severity": "HIGH", "message": "Frontend calls GET /calendar/entries${qs but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/calendars", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls POST /calendars but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/calendars/{param}/share", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls POST /calendars/{param}/share but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/resources", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls POST /resources but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/calendars/{param}", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /calendars/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/calendars/{param}", - "file": "api/calendar.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /calendars/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/user/preferences", - "file": "api/userPreferences.ts", - "severity": "HIGH", - "message": "Frontend calls GET /user/preferences but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/user/preferences/{param}", - "file": "api/userPreferences.ts", - "severity": "HIGH", - "message": "Frontend calls GET /user/preferences/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/user/preferences/{param}", - "file": "api/userPreferences.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /user/preferences/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/user/preferences/{param}", - "file": "api/userPreferences.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /user/preferences/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/plugins", - "file": "api/plugins.ts", - "severity": "HIGH", - "message": "Frontend calls GET /plugins but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/plugins/{param}/install", - "file": "api/plugins.ts", - "severity": "HIGH", - "message": "Frontend calls POST /plugins/{param}/install but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/plugins/{param}/activate", - "file": "api/plugins.ts", - "severity": "HIGH", - "message": "Frontend calls POST /plugins/{param}/activate but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/plugins/{param}/deactivate", - "file": "api/plugins.ts", - "severity": "HIGH", - "message": "Frontend calls POST /plugins/{param}/deactivate but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/plugins/{param}", - "file": "api/plugins.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /plugins/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/groups", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls GET /groups but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/groups/{param}/members", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls GET /groups/{param}/members but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/groups/user/{param}", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls GET /groups/user/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/groups", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls POST /groups but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/groups/{param}/members", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls POST /groups/{param}/members but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/groups/{param}", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /groups/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/groups/{param}", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /groups/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/groups/{param}/members/{param}", - "file": "api/groups.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /groups/{param}/members/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/permissions/{param}/{param}", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls GET /permissions/{param}/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/permissions/{param}/{param}/access", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls GET /permissions/{param}/{param}/access but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/permissions/all", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls GET /permissions/all but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/permissions/registry", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls GET /permissions/registry but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/permissions/{param}/{param}", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls POST /permissions/{param}/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/permissions/{param}/{param}/{param}", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /permissions/{param}/{param}/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/permissions/{param}/{param}/{param}", - "file": "api/entityPermissions.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /permissions/{param}/{param}/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/attachments", - "file": "api/attachments.ts", - "severity": "HIGH", - "message": "Frontend calls GET /attachments but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/addresses", - "file": "api/attachments.ts", - "severity": "HIGH", - "message": "Frontend calls GET /addresses but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/addresses", - "file": "api/attachments.ts", - "severity": "HIGH", - "message": "Frontend calls POST /addresses but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/addresses/{param}", - "file": "api/attachments.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /addresses/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/attachments/{param}", - "file": "api/attachments.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /attachments/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/addresses/{param}", - "file": "api/attachments.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /addresses/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/comm/conversations", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls GET /comm/conversations but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/comm/conversations/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls GET /comm/conversations/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/comm/conversations/{param}/messages", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls GET /comm/conversations/{param}/messages but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/comm/miniapps", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls GET /comm/miniapps but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/comm/block-types", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls GET /comm/block-types but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations/{param}/pin", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations/{param}/pin but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations/{param}/mute", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations/{param}/mute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations/{param}/participants", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations/{param}/participants but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations/{param}/messages", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations/{param}/messages but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/messages/{param}/reactions", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/messages/{param}/reactions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations/{param}/read", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations/{param}/read but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/comm/conversations/{param}/miniapps", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls POST /comm/conversations/{param}/miniapps but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/comm/conversations/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /comm/conversations/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/comm/conversations/{param}/participants/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /comm/conversations/{param}/participants/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/comm/messages/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /comm/messages/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/comm/conversations/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /comm/conversations/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/comm/conversations/{param}/pin", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /comm/conversations/{param}/pin but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/comm/conversations/{param}/mute", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /comm/conversations/{param}/mute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/comm/conversations/{param}/participants/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /comm/conversations/{param}/participants/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/comm/messages/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /comm/messages/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/comm/messages/{param}/reactions/{param}", - "file": "api/comm.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /comm/messages/{param}/reactions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dashboard/widgets", - "file": "api/dashboard.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dashboard/widgets but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/{param}/custom-fields", - "file": "api/customFields.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/{param}/custom-fields but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/contacts/{param}/custom-fields", - "file": "api/customFields.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /contacts/{param}/custom-fields but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/roles", - "file": "api/roles.ts", - "severity": "HIGH", - "message": "Frontend calls GET /roles but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/roles/permissions", - "file": "api/roles.ts", - "severity": "HIGH", - "message": "Frontend calls GET /roles/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/roles", - "file": "api/roles.ts", - "severity": "HIGH", - "message": "Frontend calls POST /roles but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/roles/{param}", - "file": "api/roles.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /roles/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/roles/{param}", - "file": "api/roles.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /roles/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -5750,30 +5580,6 @@ "severity": "HIGH", "message": "Frontend calls GET /wiki/articles${qs but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/wiki/articles/{param}", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls GET /wiki/articles/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/wiki/articles/{param}/versions", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls GET /wiki/articles/{param}/versions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/wiki/categories", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls GET /wiki/categories but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -5782,294 +5588,6 @@ "severity": "HIGH", "message": "Frontend calls GET /graph/relationships${qs but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/wiki/articles", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls POST /wiki/articles but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/wiki/articles/{param}/versions/{param}/restore", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls POST /wiki/articles/{param}/versions/{param}/restore but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/wiki/categories", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls POST /wiki/categories but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/knowledge/ask", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls POST /knowledge/ask but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/wiki/articles/{param}", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /wiki/articles/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/wiki/articles/{param}", - "file": "api/knowledge.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /wiki/articles/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mcp/tools", - "file": "api/mcp.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mcp/tools but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mcp/config", - "file": "api/mcp.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mcp/config but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mcp/tools/{param}/execute", - "file": "api/mcp.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mcp/tools/{param}/execute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dms/folders", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dms/folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dms/files/{param}", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dms/files/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dms/search", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dms/search but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dms/shared-with-me", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dms/shared-with-me but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dms/folders/{param}/files", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dms/folders/{param}/files but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/dms/files", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls GET /dms/files but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/folders", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/files/upload", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/files/upload but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/files/{param}/restore", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/files/{param}/restore but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/files/{param}/edit-session", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/files/{param}/edit-session but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/files/{param}/share", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/files/{param}/share but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/files/bulk-move", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/files/bulk-move but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/dms/files/bulk-delete", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls POST /dms/files/bulk-delete but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/dms/folders/{param}", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /dms/folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/dms/files/{param}", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /dms/files/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/dms/folders/{param}", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /dms/folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/dms/files/{param}", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /dms/files/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/dms/files/{param}/share", - "file": "api/dms.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /dms/files/{param}/share but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/automation", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /automation but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/automation/{param}", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /automation/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/automation/{param}/runs", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /automation/{param}/runs but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/automation/{param}/versions", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /automation/{param}/versions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/automation/settings", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /automation/settings but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/agents/{param}/runs", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /agents/{param}/runs but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/agents/{param}/versions", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /agents/{param}/versions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/agents/tools", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /agents/tools but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/agents/tools", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /agents/tools but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -6078,182 +5596,6 @@ "severity": "HIGH", "message": "Frontend calls GET /agents/skills but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/agents/{param}/runs", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /agents/{param}/runs but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/agents/runs/recent", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /agents/runs/recent but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/automation/miniapps", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls GET /automation/miniapps but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/automation", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /automation but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/automation/{param}/execute", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /automation/{param}/execute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/automation/{param}/dry-run", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /automation/{param}/dry-run but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/automation/{param}/versions/{param}/restore", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /automation/{param}/versions/{param}/restore but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/agents/{param}/execute", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /agents/{param}/execute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/agents/{param}/test-run", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /agents/{param}/test-run but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/agents/{param}/versions/{param}/restore", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /agents/{param}/versions/{param}/restore but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/agents/{param}/send-message", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /agents/{param}/send-message but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/automation/miniapps", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls POST /automation/miniapps but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/automation/{param}", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /automation/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/automation/settings", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /automation/settings but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/automation/{param}", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /automation/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/automation/miniapps/{param}", - "file": "api/automation.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /automation/miniapps/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/providers", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/providers but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/models", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/models but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/presets", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/presets but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/agents", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/agents but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/tools", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/tools but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/folders", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/folders but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -6262,14 +5604,6 @@ "severity": "HIGH", "message": "Frontend calls GET /ai/sessions but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/ai/conversations/{param}/messages", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls GET /ai/conversations/{param}/messages but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -6278,46 +5612,6 @@ "severity": "HIGH", "message": "Frontend calls GET /ai/sessions/{param}/attachments but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/ai/providers", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls POST /ai/providers but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/ai/models", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls POST /ai/models but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/ai/presets", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls POST /ai/presets but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/ai/agents", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls POST /ai/agents but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/ai/folders", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls POST /ai/folders but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "POST", @@ -6326,46 +5620,6 @@ "severity": "HIGH", "message": "Frontend calls POST /ai/sessions but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/ai/providers/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /ai/providers/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/ai/models/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /ai/models/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/ai/presets/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /ai/presets/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/ai/agents/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /ai/agents/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/ai/folders/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /ai/folders/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "PUT", @@ -6374,46 +5628,6 @@ "severity": "HIGH", "message": "Frontend calls PUT /ai/sessions/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/ai/providers/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /ai/providers/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/ai/models/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /ai/models/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/ai/presets/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /ai/presets/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/ai/agents/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /ai/agents/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/ai/folders/{param}", - "file": "api/ai.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /ai/folders/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "DELETE", @@ -6422,742 +5636,6 @@ "severity": "HIGH", "message": "Frontend calls DELETE /ai/sessions/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/auth/me", - "file": "api/auth.ts", - "severity": "HIGH", - "message": "Frontend calls GET /auth/me but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/auth/login", - "file": "api/auth.ts", - "severity": "HIGH", - "message": "Frontend calls POST /auth/login but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/auth/logout", - "file": "api/auth.ts", - "severity": "HIGH", - "message": "Frontend calls POST /auth/logout but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/auth/password-reset/request", - "file": "api/auth.ts", - "severity": "HIGH", - "message": "Frontend calls POST /auth/password-reset/request but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/auth/password-reset/confirm", - "file": "api/auth.ts", - "severity": "HIGH", - "message": "Frontend calls POST /auth/password-reset/confirm but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/auth/switch-tenant", - "file": "api/auth.ts", - "severity": "HIGH", - "message": "Frontend calls POST /auth/switch-tenant but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/entity-history/{param}/{param}", - "file": "api/entityHistory.ts", - "severity": "HIGH", - "message": "Frontend calls GET /entity-history/{param}/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/entity-history/trash", - "file": "api/entityHistory.ts", - "severity": "HIGH", - "message": "Frontend calls GET /entity-history/trash but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/entity-history/bulk-restore", - "file": "api/entityHistory.ts", - "severity": "HIGH", - "message": "Frontend calls POST /entity-history/bulk-restore but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/entity-history/undo/{param}/{param}", - "file": "api/entityHistory.ts", - "severity": "HIGH", - "message": "Frontend calls POST /entity-history/undo/{param}/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/system-settings", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls GET /system-settings but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/currencies", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls GET /currencies but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/taxes", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls GET /taxes but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/sequences", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls GET /sequences but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/currencies", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls POST /currencies but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/taxes", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls POST /taxes but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/sequences", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls POST /sequences but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/currencies/{param}", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /currencies/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/taxes/{param}", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /taxes/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/sequences/{param}", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /sequences/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/currencies/{param}", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /currencies/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/taxes/{param}", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /taxes/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/sequences/{param}", - "file": "api/settings.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /sequences/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/tags", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls GET /tags but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/tags/{param}/entities", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls GET /tags/{param}/entities but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tags", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tags but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tags/assign", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tags/assign but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tags/bulk-assign", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tags/bulk-assign but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/tags/{param}", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /tags/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/tags/{param}", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /tags/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/tags/assign", - "file": "api/tags.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /tags/assign but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/plugins/active-manifests", - "file": "api/pluginManifests.ts", - "severity": "HIGH", - "message": "Frontend calls GET /plugins/active-manifests but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/permissions/files/{param}/permissions", - "file": "api/permissions.ts", - "severity": "HIGH", - "message": "Frontend calls GET /permissions/files/{param}/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/permissions/files/{param}/permissions", - "file": "api/permissions.ts", - "severity": "HIGH", - "message": "Frontend calls POST /permissions/files/{param}/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/permissions/files/{param}/share-link", - "file": "api/permissions.ts", - "severity": "HIGH", - "message": "Frontend calls POST /permissions/files/{param}/share-link but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/permissions/files/{param}/permissions/{param}", - "file": "api/permissions.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /permissions/files/{param}/permissions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/permissions/share-links/{param}", - "file": "api/permissions.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /permissions/share-links/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/tasks", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls GET /tasks but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/tasks/{param}", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls GET /tasks/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/tasks/{param}/subtasks", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls GET /tasks/{param}/subtasks but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tasks", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tasks but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tasks/{param}/assign", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tasks/{param}/assign but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tasks/{param}/status", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tasks/{param}/status but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tasks/{param}/subtasks", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tasks/{param}/subtasks but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tasks/{param}/dependencies", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tasks/{param}/dependencies but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/tasks/{param}/decompose", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls POST /tasks/{param}/decompose but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/tasks/{param}", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /tasks/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/tasks/{param}", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /tasks/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/tasks/{param}/dependencies/{param}", - "file": "api/tasks.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /tasks/{param}/dependencies/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contact-folders", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contact-folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contact-folders/{param}/permissions", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contact-folders/{param}/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contact-folders", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contact-folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contact-folders/{param}/permissions", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contact-folders/{param}/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/contacts/{param}/move", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/contacts/{param}/move but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/{param}/permissions/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/{param}/permissions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/contacts/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contacts/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contact-folders/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contact-folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contact-folders/{param}/permissions/{param}", - "file": "api/contacts.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contact-folders/{param}/permissions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/workflows", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls GET /workflows but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/workflows/{param}", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls GET /workflows/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/workflows/instances", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls GET /workflows/instances but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/workflows/instances/{param}", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls GET /workflows/instances/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/workflows", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls POST /workflows but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/workflows/{param}/instances", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls POST /workflows/{param}/instances but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/workflows/instances/{param}/advance", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls POST /workflows/instances/{param}/advance but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/workflows/instances/{param}/cancel", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls POST /workflows/instances/{param}/cancel but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/workflows/{param}", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /workflows/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/workflows/{param}", - "file": "api/workflows.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /workflows/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/backups", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls GET /backups but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/system-settings/backup-config", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls GET /system-settings/backup-config but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/system-settings/backup-history", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls GET /system-settings/backup-history but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/backups", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls POST /backups but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/backups/{param}/restore", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls POST /backups/{param}/restore but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/system-settings/backup-now", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls POST /system-settings/backup-now but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/system-settings/backup-config", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /system-settings/backup-config but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/backups/{param}", - "file": "api/backups.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /backups/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/{param}/persons", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/{param}/persons but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/{param}/persons", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/{param}/persons but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts/{param}/persons", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts/{param}/persons but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts/{param}/persons", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts/{param}/persons but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contacts/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contacts/{param}/persons/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contacts/{param}/persons/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contacts/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contacts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contacts/{param}/persons/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contacts/{param}/persons/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "DELETE", @@ -7166,14 +5644,6 @@ "severity": "HIGH", "message": "Frontend calls DELETE /contacts/{param}${hard but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contacts/{param}/persons/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contacts/{param}/persons/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "DELETE", @@ -7182,62 +5652,6 @@ "severity": "HIGH", "message": "Frontend calls DELETE /contacts/{param}${hard but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contacts/{param}/persons/{param}", - "file": "api/unifiedContacts.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contacts/{param}/persons/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/reports/templates", - "file": "api/reports.ts", - "severity": "HIGH", - "message": "Frontend calls GET /reports/templates but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/reports/templates/{param}", - "file": "api/reports.ts", - "severity": "HIGH", - "message": "Frontend calls GET /reports/templates/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/reports/presets", - "file": "api/reports.ts", - "severity": "HIGH", - "message": "Frontend calls GET /reports/presets but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/reports/templates", - "file": "api/reports.ts", - "severity": "HIGH", - "message": "Frontend calls POST /reports/templates but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/reports/templates/{param}", - "file": "api/reports.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /reports/templates/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/reports/templates/{param}", - "file": "api/reports.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /reports/templates/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -7246,414 +5660,6 @@ "severity": "HIGH", "message": "Frontend calls GET /custom-fields/definitions{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/custom-fields/definitions", - "file": "api/customFieldDefinitions.ts", - "severity": "HIGH", - "message": "Frontend calls POST /custom-fields/definitions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/custom-fields/definitions/{param}", - "file": "api/customFieldDefinitions.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /custom-fields/definitions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/custom-fields/definitions/{param}", - "file": "api/customFieldDefinitions.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /custom-fields/definitions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mcp-client/servers", - "file": "api/mcpClient.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mcp-client/servers but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mcp-client/servers/{param}/tools", - "file": "api/mcpClient.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mcp-client/servers/{param}/tools but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mcp-client/servers", - "file": "api/mcpClient.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mcp-client/servers but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mcp-client/servers/{param}/execute", - "file": "api/mcpClient.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mcp-client/servers/{param}/execute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/mcp-client/servers/{param}", - "file": "api/mcpClient.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /mcp-client/servers/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/mcp-client/servers/{param}", - "file": "api/mcpClient.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /mcp-client/servers/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contacts/merge-history", - "file": "api/dedup.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contacts/merge-history but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts/duplicates", - "file": "api/dedup.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts/duplicates but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contacts/merge", - "file": "api/dedup.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contacts/merge but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/users/{param}", - "file": "api/users.ts", - "severity": "HIGH", - "message": "Frontend calls GET /users/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/users/me/menu-order", - "file": "api/users.ts", - "severity": "HIGH", - "message": "Frontend calls GET /users/me/menu-order but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/users", - "file": "api/users.ts", - "severity": "HIGH", - "message": "Frontend calls POST /users but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/users/me/menu-order", - "file": "api/users.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /users/me/menu-order but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/users/{param}", - "file": "api/users.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /users/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/users/{param}", - "file": "api/users.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /users/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contact-folders", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contact-folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contact-folders/{param}/permissions", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contact-folders/{param}/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/contact-folders/{param}/access", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls GET /contact-folders/{param}/access but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contact-folders", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contact-folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/contact-folders/{param}/permissions", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls POST /contact-folders/{param}/permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/{param}", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/{param}/reorder", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/{param}/reorder but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/contacts/{param}/move", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/contacts/{param}/move but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/contact-folders/{param}/permissions/{param}", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /contact-folders/{param}/permissions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contact-folders/{param}", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contact-folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/contact-folders/{param}/permissions/{param}", - "file": "api/contactFolders.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /contact-folders/{param}/permissions/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/compliance/ai-registry", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls GET /compliance/ai-registry but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/compliance/dpia-template", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls GET /compliance/dpia-template but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/compliance/incidents", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls GET /compliance/incidents but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/compliance/retention-policies", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls GET /compliance/retention-policies but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/compliance/incidents", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls POST /compliance/incidents but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/compliance/incidents/{param}", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /compliance/incidents/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/compliance/retention-policies/{param}", - "file": "api/compliance.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /compliance/retention-policies/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/saved-filters", - "file": "api/savedFilters.ts", - "severity": "HIGH", - "message": "Frontend calls GET /saved-filters but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/saved-filters", - "file": "api/savedFilters.ts", - "severity": "HIGH", - "message": "Frontend calls POST /saved-filters but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/saved-filters/{param}", - "file": "api/savedFilters.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /saved-filters/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/system/dashboard", - "file": "api/systemDashboard.ts", - "severity": "HIGH", - "message": "Frontend calls GET /system/dashboard but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/system/alerts", - "file": "api/systemDashboard.ts", - "severity": "HIGH", - "message": "Frontend calls GET /system/alerts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/improvement/proposals/{param}", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls GET /improvement/proposals/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/signals/collect", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/signals/collect but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/patterns/detect", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/patterns/detect but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/proposals", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/proposals but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/proposals/{param}/evaluate", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/proposals/{param}/evaluate but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/proposals/{param}/request-approval", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/proposals/{param}/request-approval but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/proposals/{param}/activate", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/proposals/{param}/activate but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/proposals/{param}/rollback", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/proposals/{param}/rollback but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/improvement/proposals/{param}/measure", - "file": "api/improvement.ts", - "severity": "HIGH", - "message": "Frontend calls POST /improvement/proposals/{param}/measure but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/policies/{param}", - "file": "api/policies.ts", - "severity": "HIGH", - "message": "Frontend calls GET /policies/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -7662,14 +5668,6 @@ "severity": "HIGH", "message": "Frontend calls GET /policies/{param}/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/policies/{param}", - "file": "api/policies.ts", - "severity": "HIGH", - "message": "Frontend calls POST /policies/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "PUT", @@ -7694,118 +5692,6 @@ "severity": "HIGH", "message": "Frontend calls GET /saved-views{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/saved-views", - "file": "api/savedViews.ts", - "severity": "HIGH", - "message": "Frontend calls POST /saved-views but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/saved-views/{param}", - "file": "api/savedViews.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /saved-views/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/saved-views/{param}", - "file": "api/savedViews.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /saved-views/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/accounts", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/accounts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/accounts/shared", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/accounts/shared but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/folders", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/search", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/search but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/threads", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/threads but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/templates", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/templates but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/signatures", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/signatures but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/rules", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/rules but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/pgp/keys", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/pgp/keys but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "GET", @@ -7814,254 +5700,6 @@ "severity": "HIGH", "message": "Frontend calls GET /mail/contacts/pgp-keys but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/mail/labels", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls GET /mail/labels but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/accounts", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/accounts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/accounts/{param}/users", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/accounts/{param}/users but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/accounts/{param}/delegates", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/accounts/{param}/delegates but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/accounts/{param}/send-permissions", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/accounts/{param}/send-permissions but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/accounts/{param}/test-connection", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/accounts/{param}/test-connection but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/accounts/{param}/sync", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/accounts/{param}/sync but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/folders", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/folders but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/folders/{param}/empty", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/folders/{param}/empty but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/folders/{param}/sync", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/folders/{param}/sync but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/send", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/send but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/{param}/reply", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/{param}/reply but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/{param}/forward", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/{param}/forward but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/{param}/link", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/{param}/link but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/{param}/create-event", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/{param}/create-event but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/{param}/labels", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/{param}/labels but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/templates", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/templates but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/templates/substitute", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/templates/substitute but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/signatures", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/signatures but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/rules", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/rules but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/vacation", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/vacation but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/vacation/test-dedup", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/vacation/test-dedup but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/pgp/keys", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/pgp/keys but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/pgp/encrypt", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/pgp/encrypt but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/contacts/{param}/pgp-key", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/contacts/{param}/pgp-key but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/labels", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/labels but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/{param}/move", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/{param}/move but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/mail/drafts", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls POST /mail/drafts but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/mail/accounts/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /mail/accounts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/mail/folders/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /mail/folders/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/mail/{param}/flags", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /mail/{param}/flags but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "PATCH", @@ -8070,30 +5708,6 @@ "severity": "HIGH", "message": "Frontend calls PATCH /mail/signatures/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "PATCH", - "url": "/mail/drafts/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls PATCH /mail/drafts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/mail/accounts/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /mail/accounts/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/mail/folders/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /mail/folders/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "DELETE", @@ -8102,14 +5716,6 @@ "severity": "HIGH", "message": "Frontend calls DELETE /mail/signatures/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/mail/rules/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /mail/rules/{param} but no matching backend endpoint found" - }, { "type": "frontend_call_no_backend", "method": "DELETE", @@ -8118,1021 +5724,341 @@ "severity": "HIGH", "message": "Frontend calls DELETE /mail/labels/{param} but no matching backend endpoint found" }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/mail/{param}", - "file": "api/mail.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /mail/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/api/v1/workspaces", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls GET /api/v1/workspaces but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/api/v1/workspaces/my", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls GET /api/v1/workspaces/my but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/api/v1/workspaces/context", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls GET /api/v1/workspaces/context but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "GET", - "url": "/api/v1/workspaces/{param}/widgets", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls GET /api/v1/workspaces/{param}/widgets but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/api/v1/workspaces", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls POST /api/v1/workspaces but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/api/v1/workspaces/{param}/modules", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls POST /api/v1/workspaces/{param}/modules but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/api/v1/workspaces/{param}/users", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls POST /api/v1/workspaces/{param}/users but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/api/v1/workspaces/{param}/widgets", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls POST /api/v1/workspaces/{param}/widgets but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "POST", - "url": "/api/v1/workspaces/{param}/set-default", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls POST /api/v1/workspaces/{param}/set-default but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/api/v1/workspaces/{param}", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /api/v1/workspaces/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "PUT", - "url": "/api/v1/workspaces/{param}/widgets/{param}", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls PUT /api/v1/workspaces/{param}/widgets/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/api/v1/workspaces/{param}", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /api/v1/workspaces/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/api/v1/workspaces/{param}/users/{param}", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /api/v1/workspaces/{param}/users/{param} but no matching backend endpoint found" - }, - { - "type": "frontend_call_no_backend", - "method": "DELETE", - "url": "/api/v1/workspaces/{param}/widgets/{param}", - "file": "api/hooks/workspaces.ts", - "severity": "HIGH", - "message": "Frontend calls DELETE /api/v1/workspaces/{param}/widgets/{param} but no matching backend endpoint found" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{filter_id}", - "file": "routes/saved_filters.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{filter_id} is never called by frontend" - }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/export", + "path": "/api/v1/audit-log", "file": "routes/audit.py", "severity": "LOW", - "message": "Backend endpoint GET /export is never called by frontend" + "message": "Backend endpoint GET /api/v1/audit-log is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/retention", + "method": "GET", + "path": "/api/v1/audit-log/export", "file": "routes/audit.py", "severity": "LOW", - "message": "Backend endpoint DELETE /retention is never called by frontend" + "message": "Backend endpoint GET /api/v1/audit-log/export is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{token_id}", + "path": "/api/v1/audit-log/retention", + "file": "routes/audit.py", + "severity": "LOW", + "message": "Backend endpoint DELETE /api/v1/audit-log/retention is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/tokens", "file": "routes/api_tokens.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{token_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{sequence_id}", - "file": "routes/sequences.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{sequence_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{sequence_id}", - "file": "routes/sequences.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{sequence_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/tokens is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/export", - "file": "routes/companies.py", + "path": "/api/v1/tokens", + "file": "routes/api_tokens.py", "severity": "LOW", - "message": "Backend endpoint GET /export is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{company_id}", - "file": "routes/companies.py", - "severity": "LOW", - "message": "Backend endpoint GET /{company_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{company_id}", - "file": "routes/companies.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{company_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/tokens is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{company_id}", - "file": "routes/companies.py", + "path": "/api/v1/tokens/{token_id}", + "file": "routes/api_tokens.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{company_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/tokens/{token_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/delegations", + "file": "routes/delegations.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/delegations is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{company_id}/contacts/{contact_id}", - "file": "routes/companies.py", + "path": "/api/v1/delegations", + "file": "routes/delegations.py", "severity": "LOW", - "message": "Backend endpoint POST /{company_id}/contacts/{contact_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/delegations is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "PUT", + "path": "/api/v1/delegations/{delegation_id}", + "file": "routes/delegations.py", + "severity": "LOW", + "message": "Backend endpoint PUT /api/v1/delegations/{delegation_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{company_id}/contacts/{contact_id}", - "file": "routes/companies.py", + "path": "/api/v1/delegations/{delegation_id}", + "file": "routes/delegations.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{company_id}/contacts/{contact_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/delegations/{delegation_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{company_id}/emails", - "file": "routes/companies.py", - "severity": "LOW", - "message": "Backend endpoint GET /{company_id}/emails is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{folder_id}", - "file": "routes/contact_folders.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{folder_id}", - "file": "routes/contact_folders.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{folder_id}/reorder", - "file": "routes/contact_folders.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{folder_id}/reorder is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/contacts/{contact_id}/move", - "file": "routes/contact_folders.py", - "severity": "LOW", - "message": "Backend endpoint PUT /contacts/{contact_id}/move is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{delegation_id}", + "path": "/api/v1/delegations/active", "file": "routes/delegations.py", "severity": "LOW", - "message": "Backend endpoint PUT /{delegation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{delegation_id}", - "file": "routes/delegations.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{delegation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/active", - "file": "routes/delegations.py", - "severity": "LOW", - "message": "Backend endpoint GET /active is never called by frontend" + "message": "Backend endpoint GET /api/v1/delegations/active is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/transfer", + "path": "/api/v1/ownership/transfer", "file": "routes/owner_transfer.py", "severity": "LOW", - "message": "Backend endpoint POST /transfer is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/export", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint GET /export is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/merge-history", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint GET /merge-history is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{contact_id}", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint GET /{contact_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{contact_id}", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{contact_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{contact_id}", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{contact_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{contact_id}/persons", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint GET /{contact_id}/persons is never called by frontend" + "message": "Backend endpoint POST /api/v1/ownership/transfer is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{contact_id}/persons", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint POST /{contact_id}/persons is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{contact_id}/persons/{person_id}", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{contact_id}/persons/{person_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{contact_id}/persons/{person_id}", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{contact_id}/persons/{person_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/duplicates", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint POST /duplicates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/merge", - "file": "routes/contacts.py", - "severity": "LOW", - "message": "Backend endpoint POST /merge is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/invite", + "path": "/api/v1/guests/invite", "file": "routes/guests.py", "severity": "LOW", - "message": "Backend endpoint POST /invite is never called by frontend" + "message": "Backend endpoint POST /api/v1/guests/invite is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{guest_id}", + "method": "GET", + "path": "/api/v1/guests", "file": "routes/guests.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{guest_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/guests is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "DELETE", + "path": "/api/v1/guests/{guest_id}", + "file": "routes/guests.py", + "severity": "LOW", + "message": "Backend endpoint DELETE /api/v1/guests/{guest_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{tenant_id}/users", + "path": "/api/v1/tenants", "file": "routes/tenants.py", "severity": "LOW", - "message": "Backend endpoint GET /{tenant_id}/users is never called by frontend" + "message": "Backend endpoint GET /api/v1/tenants is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{tenant_id}/users", + "path": "/api/v1/tenants", "file": "routes/tenants.py", "severity": "LOW", - "message": "Backend endpoint POST /{tenant_id}/users is never called by frontend" + "message": "Backend endpoint POST /api/v1/tenants is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/definitions", - "file": "routes/custom_field_definitions.py", + "path": "/api/v1/tenants/{tenant_id}/users", + "file": "routes/tenants.py", "severity": "LOW", - "message": "Backend endpoint GET /definitions is never called by frontend" + "message": "Backend endpoint GET /api/v1/tenants/{tenant_id}/users is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/definitions", - "file": "routes/custom_field_definitions.py", + "path": "/api/v1/tenants/{tenant_id}/users", + "file": "routes/tenants.py", "severity": "LOW", - "message": "Backend endpoint POST /definitions is never called by frontend" + "message": "Backend endpoint POST /api/v1/tenants/{tenant_id}/users is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/definitions/{definition_id}", + "method": "GET", + "path": "/api/v1/custom-fields/definitions", "file": "routes/custom_field_definitions.py", "severity": "LOW", - "message": "Backend endpoint PATCH /definitions/{definition_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/custom-fields/definitions is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/definitions/{definition_id}", - "file": "routes/custom_field_definitions.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /definitions/{definition_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{view_id}", + "method": "GET", + "path": "/api/v1/saved-views", "file": "routes/saved_views.py", "severity": "LOW", - "message": "Backend endpoint PUT /{view_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{view_id}", - "file": "routes/saved_views.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{view_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/saved-views is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/permissions", - "file": "routes/roles.py", - "severity": "LOW", - "message": "Backend endpoint GET /permissions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{role_id}", - "file": "routes/roles.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{role_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{role_id}", - "file": "routes/roles.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{role_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{group_id}", + "path": "/api/v1/groups/{group_id}", "file": "routes/groups.py", "severity": "LOW", - "message": "Backend endpoint GET /{group_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{group_id}", - "file": "routes/groups.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{group_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{group_id}", - "file": "routes/groups.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{group_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/groups/{group_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{group_id}/members", - "file": "routes/groups.py", + "path": "/api/v1/workspaces/{workspace_id}", + "file": "routes/workspaces.py", "severity": "LOW", - "message": "Backend endpoint GET /{group_id}/members is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{group_id}/members", - "file": "routes/groups.py", - "severity": "LOW", - "message": "Backend endpoint POST /{group_id}/members is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{group_id}/members/{user_id}", - "file": "routes/groups.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{group_id}/members/{user_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/workspaces/{workspace_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/user/{user_id}", - "file": "routes/groups.py", - "severity": "LOW", - "message": "Backend endpoint GET /user/{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/my", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint GET /my is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/context", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint GET /context is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{workspace_id}", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint GET /{workspace_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{workspace_id}", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{workspace_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{workspace_id}", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{workspace_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{workspace_id}/modules", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint POST /{workspace_id}/modules is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{workspace_id}/users", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint POST /{workspace_id}/users is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{workspace_id}/users/{user_id}", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{workspace_id}/users/{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{workspace_id}/widgets", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint GET /{workspace_id}/widgets is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{workspace_id}/widgets", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint POST /{workspace_id}/widgets is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{workspace_id}/widgets/{widget_id}", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{workspace_id}/widgets/{widget_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{workspace_id}/widgets/{widget_id}", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{workspace_id}/widgets/{widget_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{workspace_id}/set-default", - "file": "routes/workspaces.py", - "severity": "LOW", - "message": "Backend endpoint POST /{workspace_id}/set-default is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/widgets", + "path": "/api/v1/dashboard/counts", "file": "routes/dashboard.py", "severity": "LOW", - "message": "Backend endpoint GET /widgets is never called by frontend" + "message": "Backend endpoint GET /api/v1/dashboard/counts is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/counts", - "file": "routes/dashboard.py", + "path": "/api/v1/auth/me/permissions", + "file": "routes/auth.py", "severity": "LOW", - "message": "Backend endpoint GET /counts is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{backup_id}/restore", - "file": "routes/backups.py", - "severity": "LOW", - "message": "Backend endpoint POST /{backup_id}/restore is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{backup_id}", - "file": "routes/backups.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{backup_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/auth/me/permissions is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{contact_id}/custom-fields", - "file": "routes/custom_fields.py", - "severity": "LOW", - "message": "Backend endpoint GET /{contact_id}/custom-fields is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{contact_id}/custom-fields", - "file": "routes/custom_fields.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{contact_id}/custom-fields is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/login", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint POST /login is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/logout", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint POST /logout is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/me", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint GET /me is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/me/permissions", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint GET /me/permissions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/switch-tenant", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint POST /switch-tenant is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/password-reset/request", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint POST /password-reset/request is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/password-reset/confirm", - "file": "routes/auth.py", - "severity": "LOW", - "message": "Backend endpoint POST /password-reset/confirm is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{user_id}", + "path": "/api/v1/users", "file": "routes/users.py", "severity": "LOW", - "message": "Backend endpoint GET /{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{user_id}", - "file": "routes/users.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{user_id}", - "file": "routes/users.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{user_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/users is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/me/menu-order", - "file": "routes/users.py", - "severity": "LOW", - "message": "Backend endpoint GET /me/menu-order is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/me/menu-order", - "file": "routes/users.py", - "severity": "LOW", - "message": "Backend endpoint PUT /me/menu-order is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{account_id}", + "path": "/api/v1/bank-accounts", "file": "routes/bank_accounts.py", "severity": "LOW", - "message": "Backend endpoint PATCH /{account_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/bank-accounts is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{account_id}", + "method": "POST", + "path": "/api/v1/bank-accounts", "file": "routes/bank_accounts.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{account_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{webhook_id}", - "file": "routes/webhooks.py", - "severity": "LOW", - "message": "Backend endpoint GET /{webhook_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/bank-accounts is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PATCH", - "path": "/{webhook_id}", - "file": "routes/webhooks.py", + "path": "/api/v1/bank-accounts/{account_id}", + "file": "routes/bank_accounts.py", "severity": "LOW", - "message": "Backend endpoint PATCH /{webhook_id} is never called by frontend" + "message": "Backend endpoint PATCH /api/v1/bank-accounts/{account_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{webhook_id}", + "path": "/api/v1/bank-accounts/{account_id}", + "file": "routes/bank_accounts.py", + "severity": "LOW", + "message": "Backend endpoint DELETE /api/v1/bank-accounts/{account_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/webhooks", "file": "routes/webhooks.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{webhook_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/webhooks is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{webhook_id}/test", - "file": "routes/webhooks.py", + "path": "/api/v1/errors", + "file": "routes/errors.py", "severity": "LOW", - "message": "Backend endpoint POST /{webhook_id}/test is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{address_id}", - "file": "routes/addresses.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{address_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{address_id}", - "file": "routes/addresses.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{address_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/errors is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{folder_id}/permissions", - "file": "routes/contact_folder_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /{folder_id}/permissions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{folder_id}/permissions", - "file": "routes/contact_folder_permissions.py", - "severity": "LOW", - "message": "Backend endpoint POST /{folder_id}/permissions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{folder_id}/permissions/{permission_id}", - "file": "routes/contact_folder_permissions.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{folder_id}/permissions/{permission_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{folder_id}/permissions/{permission_id}", - "file": "routes/contact_folder_permissions.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{folder_id}/permissions/{permission_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{folder_id}/access", - "file": "routes/contact_folder_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /{folder_id}/access is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{tax_id}", - "file": "routes/taxes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{tax_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{tax_id}", - "file": "routes/taxes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{tax_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{notification_id}/read", + "path": "/api/v1/notifications", "file": "routes/notifications.py", "severity": "LOW", - "message": "Backend endpoint PATCH /{notification_id}/read is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/unread-count", - "file": "routes/notifications.py", - "severity": "LOW", - "message": "Backend endpoint GET /unread-count is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/types", - "file": "routes/notifications.py", - "severity": "LOW", - "message": "Backend endpoint GET /types is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/preferences", - "file": "routes/notifications.py", - "severity": "LOW", - "message": "Backend endpoint GET /preferences is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/preferences/{type_key}", - "file": "routes/notifications.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /preferences/{type_key} is never called by frontend" + "message": "Backend endpoint GET /api/v1/notifications is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/import", + "path": "/api/v1/import", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint POST /import is never called by frontend" + "message": "Backend endpoint POST /api/v1/import is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/import/preview", + "path": "/api/v1/import/preview", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint POST /import/preview is never called by frontend" + "message": "Backend endpoint POST /api/v1/import/preview is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/import/validate", + "path": "/api/v1/import/validate", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint POST /import/validate is never called by frontend" + "message": "Backend endpoint POST /api/v1/import/validate is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/import/status/{job_id}", + "path": "/api/v1/import/status/{job_id}", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint GET /import/status/{job_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/import/status/{job_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/import/contacts", + "path": "/api/v1/import/contacts", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint POST /import/contacts is never called by frontend" + "message": "Backend endpoint POST /api/v1/import/contacts is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/import/companies", + "path": "/api/v1/import/companies", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint POST /import/companies is never called by frontend" + "message": "Backend endpoint POST /api/v1/import/companies is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/export", + "path": "/api/v1/export", "file": "routes/import_export.py", "severity": "LOW", - "message": "Backend endpoint GET /export is never called by frontend" + "message": "Backend endpoint GET /api/v1/export is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{attachment_id}", + "method": "POST", + "path": "/api/v1/attachments", "file": "routes/attachments.py", "severity": "LOW", - "message": "Backend endpoint GET /{attachment_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/attachments is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{attachment_id}", + "method": "GET", + "path": "/api/v1/attachments/{attachment_id}", "file": "routes/attachments.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{attachment_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/attachments/{attachment_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", @@ -9160,259 +6086,171 @@ }, { "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/instances", + "method": "POST", + "path": "/api/v1/workflows/instances/{instance_id}/resume", "file": "routes/workflows.py", "severity": "LOW", - "message": "Backend endpoint GET /instances is never called by frontend" + "message": "Backend endpoint POST /api/v1/workflows/instances/{instance_id}/resume is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/workflows/{workflow_id}/trigger", + "file": "routes/workflows.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/workflows/{workflow_id}/trigger is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/workflows/webhook/{token}", + "file": "routes/workflows.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/workflows/webhook/{token} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{workflow_id}", + "path": "/api/v1/workflows/instances/{instance_id}/history", "file": "routes/workflows.py", "severity": "LOW", - "message": "Backend endpoint GET /{workflow_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{workflow_id}", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{workflow_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{workflow_id}", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{workflow_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/workflows/instances/{instance_id}/history is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{workflow_id}/instances", + "path": "/api/v1/workflows/instances/{instance_id}/approve", "file": "routes/workflows.py", "severity": "LOW", - "message": "Backend endpoint POST /{workflow_id}/instances is never called by frontend" + "message": "Backend endpoint POST /api/v1/workflows/instances/{instance_id}/approve is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/workflows/instances/{instance_id}/reject", + "file": "routes/workflows.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/workflows/instances/{instance_id}/reject is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/instances/{instance_id}", + "path": "/api/v1/workflows/templates", "file": "routes/workflows.py", "severity": "LOW", - "message": "Backend endpoint GET /instances/{instance_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/workflows/templates is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/instances/{instance_id}/advance", + "path": "/api/v1/workflows/templates/{template_id}/instantiate", "file": "routes/workflows.py", "severity": "LOW", - "message": "Backend endpoint POST /instances/{instance_id}/advance is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/instances/{instance_id}/cancel", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /instances/{instance_id}/cancel is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/instances/{instance_id}/resume", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /instances/{instance_id}/resume is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{workflow_id}/trigger", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /{workflow_id}/trigger is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/webhook/{token}", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /webhook/{token} is never called by frontend" + "message": "Backend endpoint POST /api/v1/workflows/templates/{template_id}/instantiate is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/instances/{instance_id}/history", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint GET /instances/{instance_id}/history is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/instances/{instance_id}/approve", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /instances/{instance_id}/approve is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/instances/{instance_id}/reject", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /instances/{instance_id}/reject is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/templates", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint GET /templates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/templates/{template_id}/instantiate", - "file": "routes/workflows.py", - "severity": "LOW", - "message": "Backend endpoint POST /templates/{template_id}/instantiate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/stats", + "path": "/api/v1/outbox/stats", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint GET /stats is never called by frontend" + "message": "Backend endpoint GET /api/v1/outbox/stats is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/failed", + "path": "/api/v1/outbox/failed", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint GET /failed is never called by frontend" + "message": "Backend endpoint GET /api/v1/outbox/failed is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/replay/{event_id}", + "path": "/api/v1/outbox/replay/{event_id}", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint POST /replay/{event_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/outbox/replay/{event_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/replay-all", + "path": "/api/v1/outbox/replay-all", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint POST /replay-all is never called by frontend" + "message": "Backend endpoint POST /api/v1/outbox/replay-all is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/consumer-registry", + "path": "/api/v1/outbox/consumer-registry", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint GET /consumer-registry is never called by frontend" + "message": "Backend endpoint GET /api/v1/outbox/consumer-registry is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/recover-stuck", + "path": "/api/v1/outbox/recover-stuck", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint POST /recover-stuck is never called by frontend" + "message": "Backend endpoint POST /api/v1/outbox/recover-stuck is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/cleanup-published", + "path": "/api/v1/outbox/cleanup-published", "file": "routes/outbox.py", "severity": "LOW", - "message": "Backend endpoint POST /cleanup-published is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/backup-config", - "file": "routes/system_settings.py", - "severity": "LOW", - "message": "Backend endpoint GET /backup-config is never called by frontend" + "message": "Backend endpoint POST /api/v1/outbox/cleanup-published is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PUT", - "path": "/backup-config", + "path": "/api/v1/system-settings", "file": "routes/system_settings.py", "severity": "LOW", - "message": "Backend endpoint PUT /backup-config is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/backup-now", - "file": "routes/system_settings.py", - "severity": "LOW", - "message": "Backend endpoint POST /backup-now is never called by frontend" + "message": "Backend endpoint PUT /api/v1/system-settings is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/backup-history", + "path": "/api/v1/system-settings/dsgvo-export/{user_id}", "file": "routes/system_settings.py", "severity": "LOW", - "message": "Backend endpoint GET /backup-history is never called by frontend" + "message": "Backend endpoint GET /api/v1/system-settings/dsgvo-export/{user_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/system-settings/dsar/{user_id}", + "file": "routes/system_settings.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/system-settings/dsar/{user_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/ai/copilot/query", + "file": "routes/ai_copilot.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/ai/copilot/query is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/ai/copilot/execute", + "file": "routes/ai_copilot.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/ai/copilot/execute is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/dsgvo-export/{user_id}", - "file": "routes/system_settings.py", - "severity": "LOW", - "message": "Backend endpoint GET /dsgvo-export/{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/dsar/{user_id}", - "file": "routes/system_settings.py", - "severity": "LOW", - "message": "Backend endpoint POST /dsar/{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/query", + "path": "/api/v1/ai/copilot/history", "file": "routes/ai_copilot.py", "severity": "LOW", - "message": "Backend endpoint POST /query is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/execute", - "file": "routes/ai_copilot.py", - "severity": "LOW", - "message": "Backend endpoint POST /execute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/history", - "file": "routes/ai_copilot.py", - "severity": "LOW", - "message": "Backend endpoint GET /history is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai/copilot/history is never called by frontend" }, { "type": "backend_endpoint_no_frontend", @@ -9424,2562 +6262,1042 @@ }, { "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{entity_type}/{entity_id}", + "method": "POST", + "path": "/api/v1/entity-history/restore", "file": "routes/entity_history.py", "severity": "LOW", - "message": "Backend endpoint GET /{entity_type}/{entity_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/entity-history/restore is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/restore", + "path": "/api/v1/entity-history/retention/archive", "file": "routes/entity_history.py", "severity": "LOW", - "message": "Backend endpoint POST /restore is never called by frontend" + "message": "Backend endpoint POST /api/v1/entity-history/retention/archive is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/undo/{entity_type}/{entity_id}", - "file": "routes/entity_history.py", - "severity": "LOW", - "message": "Backend endpoint POST /undo/{entity_type}/{entity_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/trash", - "file": "routes/entity_history.py", - "severity": "LOW", - "message": "Backend endpoint GET /trash is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/bulk-restore", - "file": "routes/entity_history.py", - "severity": "LOW", - "message": "Backend endpoint POST /bulk-restore is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/retention/archive", - "file": "routes/entity_history.py", - "severity": "LOW", - "message": "Backend endpoint POST /retention/archive is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{entity_type}", + "path": "/api/v1/policies", "file": "routes/policies.py", "severity": "LOW", - "message": "Backend endpoint GET /{entity_type} is never called by frontend" + "message": "Backend endpoint POST /api/v1/policies is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PUT", - "path": "/{policy_id}", + "path": "/api/v1/policies/{policy_id}", "file": "routes/policies.py", "severity": "LOW", - "message": "Backend endpoint PUT /{policy_id} is never called by frontend" + "message": "Backend endpoint PUT /api/v1/policies/{policy_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{policy_id}", + "path": "/api/v1/policies/{policy_id}", "file": "routes/policies.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{policy_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/policies/{policy_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/permission-templates", + "file": "routes/permission_templates.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/permission-templates is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/permission-templates", + "file": "routes/permission_templates.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/permission-templates is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PUT", - "path": "/{template_id}", + "path": "/api/v1/permission-templates/{template_id}", "file": "routes/permission_templates.py", "severity": "LOW", - "message": "Backend endpoint PUT /{template_id} is never called by frontend" + "message": "Backend endpoint PUT /api/v1/permission-templates/{template_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{template_id}", + "path": "/api/v1/permission-templates/{template_id}", "file": "routes/permission_templates.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{template_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/permission-templates/{template_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/apply", + "path": "/api/v1/permission-templates/apply", "file": "routes/permission_templates.py", "severity": "LOW", - "message": "Backend endpoint POST /apply is never called by frontend" + "message": "Backend endpoint POST /api/v1/permission-templates/apply is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/permissions/bulk", + "file": "routes/entity_permissions.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/permissions/bulk is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/permissions/bulk/unshare", + "file": "routes/entity_permissions.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/permissions/bulk/unshare is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/permissions/analytics", + "file": "routes/entity_permissions.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/permissions/analytics is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/plugins/manifest", + "file": "routes/plugins.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/plugins/manifest is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/plugins/updates", + "file": "routes/plugins.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/plugins/updates is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/plugins/{name}/config", + "file": "routes/plugins.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/plugins/{name}/config is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PATCH", - "path": "/{currency_id}", - "file": "routes/currencies.py", + "path": "/api/v1/plugins/{name}/config", + "file": "routes/plugins.py", "severity": "LOW", - "message": "Backend endpoint PATCH /{currency_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{currency_id}", - "file": "routes/currencies.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{currency_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{key}", - "file": "routes/user_preferences.py", - "severity": "LOW", - "message": "Backend endpoint GET /{key} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{key}", - "file": "routes/user_preferences.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{key} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{key}", - "file": "routes/user_preferences.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{key} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{entity_type}/{entity_id}", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /{entity_type}/{entity_id} is never called by frontend" + "message": "Backend endpoint PATCH /api/v1/plugins/{name}/config is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{entity_type}/{entity_id}", - "file": "routes/entity_permissions.py", + "path": "/api/v1/plugins/upload", + "file": "routes/plugins.py", "severity": "LOW", - "message": "Backend endpoint POST /{entity_type}/{entity_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/{entity_type}/{entity_id}/{permission_id}", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint PUT /{entity_type}/{entity_id}/{permission_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{entity_type}/{entity_id}/{permission_id}", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{entity_type}/{entity_id}/{permission_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{entity_type}/{entity_id}/access", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /{entity_type}/{entity_id}/access is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/all", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /all is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/registry", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /registry is never called by frontend" + "message": "Backend endpoint POST /api/v1/plugins/upload is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/bulk", - "file": "routes/entity_permissions.py", + "path": "/api/v1/plugins/install-url", + "file": "routes/plugins.py", "severity": "LOW", - "message": "Backend endpoint POST /bulk is never called by frontend" + "message": "Backend endpoint POST /api/v1/plugins/install-url is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/bulk/unshare", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint POST /bulk/unshare is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/analytics", - "file": "routes/entity_permissions.py", - "severity": "LOW", - "message": "Backend endpoint GET /analytics is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/manifest", + "path": "/api/v1/plugins/install-marketplace", "file": "routes/plugins.py", "severity": "LOW", - "message": "Backend endpoint GET /manifest is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/updates", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint GET /updates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/active-manifests", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint GET /active-manifests is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{name}/config", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint GET /{name}/config is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{name}/config", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{name}/config is never called by frontend" + "message": "Backend endpoint POST /api/v1/plugins/install-marketplace is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{name}/install", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint POST /{name}/install is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{name}/activate", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint POST /{name}/activate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{name}/deactivate", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint POST /{name}/deactivate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{name}", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{name} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/upload", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint POST /upload is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/install-url", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint POST /install-url is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/install-marketplace", - "file": "routes/plugins.py", - "severity": "LOW", - "message": "Backend endpoint POST /install-marketplace is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/ai-registry", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint GET /ai-registry is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/dpia-template", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint GET /dpia-template is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/incidents", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint GET /incidents is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/incidents", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint POST /incidents is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/incidents/{incident_id}", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /incidents/{incident_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/retention-policies", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint GET /retention-policies is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/retention-policies/{key}", - "file": "routes/compliance.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /retention-policies/{key} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{request_id}", + "path": "/api/v1/approvals", "file": "routes/approvals.py", "severity": "LOW", - "message": "Backend endpoint GET /{request_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/approvals is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{request_id}/approve", + "method": "GET", + "path": "/api/v1/approvals", "file": "routes/approvals.py", "severity": "LOW", - "message": "Backend endpoint POST /{request_id}/approve is never called by frontend" + "message": "Backend endpoint GET /api/v1/approvals is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{request_id}/reject", + "method": "GET", + "path": "/api/v1/approvals/{request_id}", "file": "routes/approvals.py", "severity": "LOW", - "message": "Backend endpoint POST /{request_id}/reject is never called by frontend" + "message": "Backend endpoint GET /api/v1/approvals/{request_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{request_id}/expire", + "path": "/api/v1/approvals/{request_id}/approve", "file": "routes/approvals.py", "severity": "LOW", - "message": "Backend endpoint POST /{request_id}/expire is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/dashboard", - "file": "routes/system_dashboard.py", - "severity": "LOW", - "message": "Backend endpoint GET /dashboard is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/alerts", - "file": "routes/system_dashboard.py", - "severity": "LOW", - "message": "Backend endpoint GET /alerts is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/servers", - "file": "plugins/builtins/mcp_client/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /servers is never called by frontend" + "message": "Backend endpoint POST /api/v1/approvals/{request_id}/approve is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/servers", - "file": "plugins/builtins/mcp_client/routes.py", + "path": "/api/v1/approvals/{request_id}/reject", + "file": "routes/approvals.py", "severity": "LOW", - "message": "Backend endpoint POST /servers is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/servers/{server_id}", - "file": "plugins/builtins/mcp_client/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /servers/{server_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/servers/{server_id}", - "file": "plugins/builtins/mcp_client/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /servers/{server_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/servers/{server_id}/tools", - "file": "plugins/builtins/mcp_client/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /servers/{server_id}/tools is never called by frontend" + "message": "Backend endpoint POST /api/v1/approvals/{request_id}/reject is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/servers/{server_id}/execute", - "file": "plugins/builtins/mcp_client/routes.py", + "path": "/api/v1/approvals/{request_id}/expire", + "file": "routes/approvals.py", "severity": "LOW", - "message": "Backend endpoint POST /servers/{server_id}/execute is never called by frontend" + "message": "Backend endpoint POST /api/v1/approvals/{request_id}/expire is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/status", + "path": "/api/v1/forgejo-error-reporter/status", "file": "plugins/builtins/forgejo_error_reporter/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /status is never called by frontend" + "message": "Backend endpoint GET /api/v1/forgejo-error-reporter/status is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/automation/runs/recent", + "file": "plugins/builtins/automation/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/automation/runs/recent is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/automation/subtasks", + "file": "plugins/builtins/automation/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/automation/subtasks is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/", + "path": "/api/v1/automation/subtasks", "file": "plugins/builtins/automation/routes.py", "severity": "LOW", - "message": "Backend endpoint POST / is never called by frontend" + "message": "Backend endpoint POST /api/v1/automation/subtasks is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/runs/recent", + "path": "/api/v1/automation/subtasks/{subtask_id}", "file": "plugins/builtins/automation/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /runs/recent is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/miniapps", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /miniapps is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/miniapps", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /miniapps is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/miniapps/{app_id}", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /miniapps/{app_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/settings", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /settings is never called by frontend" + "message": "Backend endpoint GET /api/v1/automation/subtasks/{subtask_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PATCH", - "path": "/settings", + "path": "/api/v1/automation/subtasks/{subtask_id}", "file": "plugins/builtins/automation/routes.py", "severity": "LOW", - "message": "Backend endpoint PATCH /settings is never called by frontend" + "message": "Backend endpoint PATCH /api/v1/automation/subtasks/{subtask_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/automation/subtasks/{subtask_id}/cancel", + "file": "plugins/builtins/automation/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/automation/subtasks/{subtask_id}/cancel is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/automation/subtasks/{subtask_id}/wait", + "file": "plugins/builtins/automation/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/automation/subtasks/{subtask_id}/wait is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/automation/subtasks/aggregate", + "file": "plugins/builtins/automation/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/automation/subtasks/aggregate is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{automation_id}", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{automation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{automation_id}", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{automation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{automation_id}", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{automation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{automation_id}/execute", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{automation_id}/execute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{automation_id}/dry-run", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{automation_id}/dry-run is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{automation_id}/runs", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{automation_id}/runs is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{automation_id}/versions", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{automation_id}/versions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{automation_id}/versions/{version_id}/restore", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{automation_id}/versions/{version_id}/restore is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/subtasks", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /subtasks is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/subtasks", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /subtasks is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/subtasks/{subtask_id}", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /subtasks/{subtask_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/subtasks/{subtask_id}", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /subtasks/{subtask_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/subtasks/{subtask_id}/cancel", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /subtasks/{subtask_id}/cancel is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/subtasks/{subtask_id}/wait", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /subtasks/{subtask_id}/wait is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/subtasks/aggregate", - "file": "plugins/builtins/automation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /subtasks/aggregate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/", + "path": "/api/v1/skills", "file": "plugins/builtins/automation/skill_routes.py", "severity": "LOW", - "message": "Backend endpoint POST / is never called by frontend" + "message": "Backend endpoint GET /api/v1/skills is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{skill_id}", + "method": "POST", + "path": "/api/v1/skills/", "file": "plugins/builtins/automation/skill_routes.py", "severity": "LOW", - "message": "Backend endpoint GET /{skill_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/skills/ is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{skill_id}", + "method": "GET", + "path": "/api/v1/skills/{skill_id}", "file": "plugins/builtins/automation/skill_routes.py", "severity": "LOW", - "message": "Backend endpoint PATCH /{skill_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/skills/{skill_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{skill_id}", + "method": "PATCH", + "path": "/api/v1/skills/{skill_id}", "file": "plugins/builtins/automation/skill_routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{skill_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint POST / is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/tools", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /tools is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/runs/recent", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /runs/recent is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{agent_id}", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{agent_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{agent_id}", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{agent_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{agent_id}/ai-use-case", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{agent_id}/ai-use-case is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{agent_id}/ai-use-case", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{agent_id}/ai-use-case is never called by frontend" + "message": "Backend endpoint PATCH /api/v1/skills/{skill_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{agent_id}", - "file": "plugins/builtins/automation/agent_routes.py", + "path": "/api/v1/skills/{skill_id}", + "file": "plugins/builtins/automation/skill_routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{agent_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{agent_id}/execute", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{agent_id}/execute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{agent_id}/test-run", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{agent_id}/test-run is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/skills/{skill_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{agent_id}/runs", + "path": "/api/v1/agents/{agent_id}/ai-use-case", "file": "plugins/builtins/automation/agent_routes.py", "severity": "LOW", - "message": "Backend endpoint GET /{agent_id}/runs is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{agent_id}/versions", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{agent_id}/versions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{agent_id}/versions/{version_id}/restore", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{agent_id}/versions/{version_id}/restore is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{id}/send-message", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{id}/send-message is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{id}/stream", - "file": "plugins/builtins/automation/agent_routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{id}/stream is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/folders", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /folders is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/folders", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /folders is never called by frontend" + "message": "Backend endpoint GET /api/v1/agents/{agent_id}/ai-use-case is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PATCH", - "path": "/folders/{folder_id}", - "file": "plugins/builtins/dms/routes.py", + "path": "/api/v1/agents/{agent_id}/ai-use-case", + "file": "plugins/builtins/automation/agent_routes.py", "severity": "LOW", - "message": "Backend endpoint PATCH /folders/{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/folders/{folder_id}", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /folders/{folder_id} is never called by frontend" + "message": "Backend endpoint PATCH /api/v1/agents/{agent_id}/ai-use-case is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/files/upload", - "file": "plugins/builtins/dms/routes.py", + "path": "/api/v1/agents/{id}/stream", + "file": "plugins/builtins/automation/agent_routes.py", "severity": "LOW", - "message": "Backend endpoint POST /files/upload is never called by frontend" + "message": "Backend endpoint POST /api/v1/agents/{id}/stream is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/files/{file_id}", + "path": "/api/v1/dms/files/{file_id}/preview", "file": "plugins/builtins/dms/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /files/{file_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/dms/files/{file_id}/preview is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/files", + "path": "/api/v1/dms/files/{file_id}/download", "file": "plugins/builtins/dms/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /files is never called by frontend" + "message": "Backend endpoint GET /api/v1/dms/files/{file_id}/download is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/mail/upload-attachment", + "file": "plugins/builtins/mail/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/mail/upload-attachment is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/mail/{mail_id}/apply-rules", + "file": "plugins/builtins/mail/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/mail/{mail_id}/apply-rules is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/folders/{folder_id}/files", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /folders/{folder_id}/files is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/files/{file_id}", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /files/{file_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/files/{file_id}", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /files/{file_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/files/{file_id}/restore", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /files/{file_id}/restore is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/files/{file_id}/preview", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /files/{file_id}/preview is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/files/{file_id}/download", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /files/{file_id}/download is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/files/{file_id}/edit-session", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /files/{file_id}/edit-session is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/files/{file_id}/share", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /files/{file_id}/share is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/files/{file_id}/share", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /files/{file_id}/share is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/search", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /search is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/shared-with-me", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /shared-with-me is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/files/bulk-move", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /files/bulk-move is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/files/bulk-delete", - "file": "plugins/builtins/dms/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /files/bulk-delete is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/accounts", + "path": "/api/v1/mail/{mail_id}/attachments/{att_id}", "file": "plugins/builtins/mail/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /accounts is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/accounts", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /accounts is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/accounts/shared", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /accounts/shared is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/accounts/{account_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /accounts/{account_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/accounts/{account_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /accounts/{account_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/accounts/{account_id}/users", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /accounts/{account_id}/users is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/accounts/{account_id}/delegates", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /accounts/{account_id}/delegates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/accounts/{account_id}/send-permissions", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /accounts/{account_id}/send-permissions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/accounts/{account_id}/test-connection", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /accounts/{account_id}/test-connection is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/accounts/{account_id}/sync", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /accounts/{account_id}/sync is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/folders", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /folders is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/folders", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /folders is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/folders/{folder_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /folders/{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/folders/{folder_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /folders/{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/folders/{folder_id}/empty", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /folders/{folder_id}/empty is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/folders/{folder_id}/sync", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /folders/{folder_id}/sync is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/upload-attachment", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /upload-attachment is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/send", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /send is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/search", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /search is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/threads", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /threads is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/templates", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /templates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/templates", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /templates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/templates/substitute", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /templates/substitute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/signatures", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /signatures is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/signatures", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /signatures is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/rules", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /rules is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/rules", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /rules is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/rules/{rule_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /rules/{rule_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/vacation", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /vacation is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/vacation/test-dedup", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /vacation/test-dedup is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/pgp/keys", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /pgp/keys is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/pgp/keys", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /pgp/keys is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/pgp/encrypt", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /pgp/encrypt is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/labels", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /labels is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/labels", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /labels is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/contacts/{contact_id}/pgp-key", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /contacts/{contact_id}/pgp-key is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{mail_id}/apply-rules", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/apply-rules is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{mail_id}/reply", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/reply is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{mail_id}/forward", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/forward is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{mail_id}/flags", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{mail_id}/flags is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{mail_id}/attachments/{att_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{mail_id}/attachments/{att_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{mail_id}/link", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/link is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{mail_id}/create-event", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/create-event is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{mail_id}/labels", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/labels is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/drafts", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /drafts is never called by frontend" + "message": "Backend endpoint GET /api/v1/mail/{mail_id}/attachments/{att_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PUT", - "path": "/drafts/{mail_id}", + "path": "/api/v1/mail/drafts/{mail_id}", "file": "plugins/builtins/mail/routes.py", "severity": "LOW", - "message": "Backend endpoint PUT /drafts/{mail_id} is never called by frontend" + "message": "Backend endpoint PUT /api/v1/mail/drafts/{mail_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/wiki/articles", + "file": "plugins/builtins/wiki/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/wiki/articles is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/contacts", + "file": "plugins/builtins/contacts/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/contacts is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/contacts/export", + "file": "plugins/builtins/contacts/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/contacts/export is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/companies", + "file": "plugins/builtins/contacts/company_routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/companies is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/companies", + "file": "plugins/builtins/contacts/company_routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/companies is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/companies/export", + "file": "plugins/builtins/contacts/company_routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/companies/export is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/companies/{company_id}", + "file": "plugins/builtins/contacts/company_routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/companies/{company_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "PUT", + "path": "/api/v1/companies/{company_id}", + "file": "plugins/builtins/contacts/company_routes.py", + "severity": "LOW", + "message": "Backend endpoint PUT /api/v1/companies/{company_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/{mail_id}", - "file": "plugins/builtins/mail/routes.py", + "path": "/api/v1/companies/{company_id}", + "file": "plugins/builtins/contacts/company_routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{mail_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/companies/{company_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{mail_id}/move", - "file": "plugins/builtins/mail/routes.py", + "path": "/api/v1/companies/{company_id}/contacts/{contact_id}", + "file": "plugins/builtins/contacts/company_routes.py", "severity": "LOW", - "message": "Backend endpoint POST /{mail_id}/move is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{mail_id}", - "file": "plugins/builtins/mail/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{mail_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/articles", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /articles is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/articles", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /articles is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/articles/{article_id}", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /articles/{article_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/articles/{article_id}", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /articles/{article_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/companies/{company_id}/contacts/{contact_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/articles/{article_id}", - "file": "plugins/builtins/wiki/routes.py", + "path": "/api/v1/companies/{company_id}/contacts/{contact_id}", + "file": "plugins/builtins/contacts/company_routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /articles/{article_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/companies/{company_id}/contacts/{contact_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/articles/{article_id}/versions", - "file": "plugins/builtins/wiki/routes.py", + "path": "/api/v1/companies/{company_id}/emails", + "file": "plugins/builtins/contacts/company_routes.py", "severity": "LOW", - "message": "Backend endpoint GET /articles/{article_id}/versions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/articles/{article_id}/versions/{version}/restore", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /articles/{article_id}/versions/{version}/restore is never called by frontend" + "message": "Backend endpoint GET /api/v1/companies/{company_id}/emails is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/categories", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /categories is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/categories", - "file": "plugins/builtins/wiki/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /categories is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{task_id}", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{task_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{task_id}", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{task_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{task_id}", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{task_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{task_id}/assign", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{task_id}/assign is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{task_id}/status", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{task_id}/status is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{task_id}/subtasks", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{task_id}/subtasks is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{task_id}/subtasks", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{task_id}/subtasks is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{task_id}/dependencies", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{task_id}/dependencies is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{task_id}/dependencies/{depends_on}", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{task_id}/dependencies/{depends_on} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/{task_id}/decompose", - "file": "plugins/builtins/tasks/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /{task_id}/decompose is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/calendar/entries", + "path": "/api/v1/calendar/entries", "file": "plugins/builtins/calendar/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /calendar/entries is never called by frontend" + "message": "Backend endpoint GET /api/v1/calendar/entries is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/calendar/entries/export", + "path": "/api/v1/calendar/entries/export", "file": "plugins/builtins/calendar/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /calendar/entries/export is never called by frontend" + "message": "Backend endpoint GET /api/v1/calendar/entries/export is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/calendar/entries/{entry_id}/link", + "path": "/api/v1/calendar/entries/{entry_id}/link", "file": "plugins/builtins/calendar/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /calendar/entries/{entry_id}/link is never called by frontend" + "message": "Backend endpoint POST /api/v1/calendar/entries/{entry_id}/link is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/calendar/entries/bulk", + "path": "/api/v1/calendar/entries/bulk", "file": "plugins/builtins/calendar/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /calendar/entries/bulk is never called by frontend" + "message": "Backend endpoint POST /api/v1/calendar/entries/bulk is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/calendar/{calendar_id}/ics-feed", + "path": "/api/v1/calendar/{calendar_id}/ics-feed", "file": "plugins/builtins/calendar/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /calendar/{calendar_id}/ics-feed is never called by frontend" + "message": "Backend endpoint GET /api/v1/calendar/{calendar_id}/ics-feed is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/calendar/import", + "path": "/api/v1/calendar/import", "file": "plugins/builtins/calendar/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /calendar/import is never called by frontend" + "message": "Backend endpoint POST /api/v1/calendar/import is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/facets", + "path": "/api/v1/search", "file": "plugins/builtins/unified_search/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /facets is never called by frontend" + "message": "Backend endpoint GET /api/v1/search is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/search", + "file": "plugins/builtins/unified_search/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/search is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/suggest", + "path": "/api/v1/search/facets", "file": "plugins/builtins/unified_search/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /suggest is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/similar", - "file": "plugins/builtins/unified_search/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /similar is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/reindex", - "file": "plugins/builtins/unified_search/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /reindex is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/rebuild/{entity_type}/{entity_id}", - "file": "plugins/builtins/unified_search/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /rebuild/{entity_type}/{entity_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/purge/{entity_type}/{entity_id}", - "file": "plugins/builtins/unified_search/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /purge/{entity_type}/{entity_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/search/facets is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/providers", + "path": "/api/v1/search/suggest", "file": "plugins/builtins/unified_search/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /providers is never called by frontend" + "message": "Backend endpoint GET /api/v1/search/suggest is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/providers/{entity_type}/toggle", + "path": "/api/v1/search/similar", "file": "plugins/builtins/unified_search/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /providers/{entity_type}/toggle is never called by frontend" + "message": "Backend endpoint POST /api/v1/search/similar is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/search/reindex", + "file": "plugins/builtins/unified_search/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/search/reindex is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/search/rebuild/{entity_type}/{entity_id}", + "file": "plugins/builtins/unified_search/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/search/rebuild/{entity_type}/{entity_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/search/purge/{entity_type}/{entity_id}", + "file": "plugins/builtins/unified_search/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/search/purge/{entity_type}/{entity_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/stats", + "path": "/api/v1/search/providers", "file": "plugins/builtins/unified_search/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /stats is never called by frontend" + "message": "Backend endpoint GET /api/v1/search/providers is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/search/providers/{entity_type}/toggle", + "file": "plugins/builtins/unified_search/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/search/providers/{entity_type}/toggle is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/search", + "path": "/api/v1/search/stats", + "file": "plugins/builtins/unified_search/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/search/stats is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/agent-memory", "file": "plugins/builtins/agent_memory/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /search is never called by frontend" + "message": "Backend endpoint POST /api/v1/agent-memory is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{memory_id}", + "method": "GET", + "path": "/api/v1/agent-memory", "file": "plugins/builtins/agent_memory/routes.py", "severity": "LOW", - "message": "Backend endpoint PATCH /{memory_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/agent-memory is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{memory_id}", + "method": "GET", + "path": "/api/v1/agent-memory/search", "file": "plugins/builtins/agent_memory/routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /{memory_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/agent-memory/search is never called by frontend" }, { "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/listings", - "file": "plugins/builtins/marketplace/routes.py", + "method": "PATCH", + "path": "/api/v1/agent-memory/{memory_id}", + "file": "plugins/builtins/agent_memory/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /listings is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/listings/{name}", - "file": "plugins/builtins/marketplace/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /listings/{name} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/install/{name}", - "file": "plugins/builtins/marketplace/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /install/{name} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/verify/{name}", - "file": "plugins/builtins/marketplace/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /verify/{name} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/categories", - "file": "plugins/builtins/marketplace/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /categories is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/relationships", - "file": "plugins/builtins/graph_rag/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /relationships is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/relationships", - "file": "plugins/builtins/graph_rag/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /relationships is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/traverse", - "file": "plugins/builtins/graph_rag/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /traverse is never called by frontend" + "message": "Backend endpoint PATCH /api/v1/agent-memory/{memory_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/relationships/{relationship_id}", + "path": "/api/v1/agent-memory/{memory_id}", + "file": "plugins/builtins/agent_memory/routes.py", + "severity": "LOW", + "message": "Backend endpoint DELETE /api/v1/agent-memory/{memory_id} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/marketplace/listings", + "file": "plugins/builtins/marketplace/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/marketplace/listings is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/marketplace/listings/{name}", + "file": "plugins/builtins/marketplace/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/marketplace/listings/{name} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/marketplace/install/{name}", + "file": "plugins/builtins/marketplace/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/marketplace/install/{name} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/marketplace/verify/{name}", + "file": "plugins/builtins/marketplace/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/marketplace/verify/{name} is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "GET", + "path": "/api/v1/marketplace/categories", + "file": "plugins/builtins/marketplace/routes.py", + "severity": "LOW", + "message": "Backend endpoint GET /api/v1/marketplace/categories is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/graph/relationships", "file": "plugins/builtins/graph_rag/routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /relationships/{relationship_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/graph/relationships is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/presets", - "file": "plugins/builtins/report_generator/routes.py", + "path": "/api/v1/graph/relationships", + "file": "plugins/builtins/graph_rag/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /presets is never called by frontend" + "message": "Backend endpoint GET /api/v1/graph/relationships is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/presets/generate", - "file": "plugins/builtins/report_generator/routes.py", + "path": "/api/v1/graph/traverse", + "file": "plugins/builtins/graph_rag/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /presets/generate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/templates", - "file": "plugins/builtins/report_generator/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /templates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/templates", - "file": "plugins/builtins/report_generator/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /templates is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/templates/{template_id}", - "file": "plugins/builtins/report_generator/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /templates/{template_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/templates/{template_id}", - "file": "plugins/builtins/report_generator/routes.py", - "severity": "LOW", - "message": "Backend endpoint PUT /templates/{template_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/graph/traverse is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/templates/{template_id}", - "file": "plugins/builtins/report_generator/routes.py", + "path": "/api/v1/graph/relationships/{relationship_id}", + "file": "plugins/builtins/graph_rag/routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /templates/{template_id} is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/graph/relationships/{relationship_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/generate", + "path": "/api/v1/reports/presets/generate", "file": "plugins/builtins/report_generator/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /generate is never called by frontend" + "message": "Backend endpoint POST /api/v1/reports/presets/generate is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/generate/async", + "path": "/api/v1/reports/generate", "file": "plugins/builtins/report_generator/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /generate/async is never called by frontend" + "message": "Backend endpoint POST /api/v1/reports/generate is never called by frontend" + }, + { + "type": "backend_endpoint_no_frontend", + "method": "POST", + "path": "/api/v1/reports/generate/async", + "file": "plugins/builtins/report_generator/routes.py", + "severity": "LOW", + "message": "Backend endpoint POST /api/v1/reports/generate/async is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{report_id}", + "path": "/api/v1/reports/{report_id}", "file": "plugins/builtins/report_generator/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /{report_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/reports/{report_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{report_id}/download", + "path": "/api/v1/reports/{report_id}/download", "file": "plugins/builtins/report_generator/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /{report_id}/download is never called by frontend" + "message": "Backend endpoint GET /api/v1/reports/{report_id}/download is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/extract", + "path": "/api/v1/knowledge/extract", "file": "plugins/builtins/knowledge/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /extract is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/ask", - "file": "plugins/builtins/knowledge/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /ask is never called by frontend" + "message": "Backend endpoint POST /api/v1/knowledge/extract is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/review", + "path": "/api/v1/knowledge/review", "file": "plugins/builtins/knowledge/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /review is never called by frontend" + "message": "Backend endpoint GET /api/v1/knowledge/review is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/review/{extraction_id}", + "path": "/api/v1/knowledge/review/{extraction_id}", "file": "plugins/builtins/knowledge/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /review/{extraction_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/knowledge/review/{extraction_id} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/files/{file_id}/link", + "path": "/api/v1/entity-links/files/{file_id}/link", "file": "plugins/builtins/entity_links/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /files/{file_id}/link is never called by frontend" + "message": "Backend endpoint POST /api/v1/entity-links/files/{file_id}/link is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "DELETE", - "path": "/files/{file_id}/link", + "path": "/api/v1/entity-links/files/{file_id}/link", "file": "plugins/builtins/entity_links/routes.py", "severity": "LOW", - "message": "Backend endpoint DELETE /files/{file_id}/link is never called by frontend" + "message": "Backend endpoint DELETE /api/v1/entity-links/files/{file_id}/link is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/files/{file_id}/links", + "path": "/api/v1/entity-links/files/{file_id}/links", "file": "plugins/builtins/entity_links/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /files/{file_id}/links is never called by frontend" + "message": "Backend endpoint GET /api/v1/entity-links/files/{file_id}/links is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/conversations", - "file": "plugins/builtins/kommunikation/routes.py", + "path": "/api/v1/contacts/{contact_id}/files", + "file": "plugins/builtins/entity_links/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /conversations is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/conversations", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations is never called by frontend" + "message": "Backend endpoint GET /api/v1/contacts/{contact_id}/files is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/conversations/{conversation_id}", - "file": "plugins/builtins/kommunikation/routes.py", + "path": "/api/v1/companies/{company_id}/files", + "file": "plugins/builtins/entity_links/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /conversations/{conversation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/conversations/{conversation_id}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /conversations/{conversation_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/conversations/{conversation_id}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /conversations/{conversation_id} is never called by frontend" + "message": "Backend endpoint GET /api/v1/companies/{company_id}/files is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/conversations/{conversation_id}/pin", + "path": "/api/v1/comm/messages/{message_id}/attachments", "file": "plugins/builtins/kommunikation/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/pin is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/conversations/{conversation_id}/pin", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /conversations/{conversation_id}/pin is never called by frontend" + "message": "Backend endpoint POST /api/v1/comm/messages/{message_id}/attachments is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/conversations/{conversation_id}/mute", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/mute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/conversations/{conversation_id}/mute", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /conversations/{conversation_id}/mute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/conversations/{conversation_id}/participants", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/participants is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/conversations/{conversation_id}/participants/{participant_id}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /conversations/{conversation_id}/participants/{participant_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/conversations/{conversation_id}/participants/{participant_id}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /conversations/{conversation_id}/participants/{participant_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/conversations/{conversation_id}/messages", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /conversations/{conversation_id}/messages is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/conversations/{conversation_id}/messages", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/messages is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/messages/{message_id}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /messages/{message_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/messages/{message_id}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /messages/{message_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/messages/{message_id}/attachments", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /messages/{message_id}/attachments is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/messages/{message_id}/reactions", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /messages/{message_id}/reactions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/messages/{message_id}/reactions/{emoji}", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /messages/{message_id}/reactions/{emoji} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/conversations/{conversation_id}/read", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/read is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/miniapps", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /miniapps is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/conversations/{conversation_id}/miniapps", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/miniapps is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/block-types", - "file": "plugins/builtins/kommunikation/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /block-types is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/context", + "path": "/api/v1/ai-proactive/context", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /context is never called by frontend" + "message": "Backend endpoint POST /api/v1/ai-proactive/context is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/suggestions", + "path": "/api/v1/ai-proactive/suggestions", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /suggestions is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai-proactive/suggestions is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/suggestions/{suggestion_id}/dismiss", + "path": "/api/v1/ai-proactive/suggestions/{suggestion_id}/dismiss", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /suggestions/{suggestion_id}/dismiss is never called by frontend" + "message": "Backend endpoint POST /api/v1/ai-proactive/suggestions/{suggestion_id}/dismiss is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/suggestions/{suggestion_id}/act", + "path": "/api/v1/ai-proactive/suggestions/{suggestion_id}/act", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /suggestions/{suggestion_id}/act is never called by frontend" + "message": "Backend endpoint POST /api/v1/ai-proactive/suggestions/{suggestion_id}/act is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/suggestions/stream", + "path": "/api/v1/ai-proactive/suggestions/stream", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /suggestions/stream is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai-proactive/suggestions/stream is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/settings", + "path": "/api/v1/ai-proactive/settings", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /settings is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai-proactive/settings is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "PUT", - "path": "/settings", + "path": "/api/v1/ai-proactive/settings", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint PUT /settings is never called by frontend" + "message": "Backend endpoint PUT /api/v1/ai-proactive/settings is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/stats", + "path": "/api/v1/ai-proactive/stats", "file": "plugins/builtins/ai_proactive/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /stats is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai-proactive/stats is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{agent_id}/run", + "path": "/api/v1/external/agent/{agent_id}/run", "file": "plugins/builtins/ai_assistant/external_api.py", "severity": "LOW", - "message": "Backend endpoint POST /{agent_id}/run is never called by frontend" + "message": "Backend endpoint POST /api/v1/external/agent/{agent_id}/run is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{agent_id}/status", + "path": "/api/v1/external/agent/{agent_id}/status", "file": "plugins/builtins/ai_assistant/external_api.py", "severity": "LOW", - "message": "Backend endpoint GET /{agent_id}/status is never called by frontend" + "message": "Backend endpoint GET /api/v1/external/agent/{agent_id}/status is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{agent_id}/stream", + "path": "/api/v1/external/agent/{agent_id}/stream", "file": "plugins/builtins/ai_assistant/external_api.py", "severity": "LOW", - "message": "Backend endpoint POST /{agent_id}/stream is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/providers", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /providers is never called by frontend" + "message": "Backend endpoint POST /api/v1/external/agent/{agent_id}/stream is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/providers", + "path": "/api/v1/ai/conversations/{conversation_id}/stream", "file": "plugins/builtins/ai_assistant/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /providers is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/providers/{provider_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint PUT /providers/{provider_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/providers/{provider_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /providers/{provider_id} is never called by frontend" + "message": "Backend endpoint POST /api/v1/ai/conversations/{conversation_id}/stream is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/models", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /models is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/models", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /models is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/models/{model_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint PUT /models/{model_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/models/{model_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /models/{model_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/presets", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /presets is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/presets", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /presets is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/presets/{preset_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint PUT /presets/{preset_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/presets/{preset_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /presets/{preset_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/agents/{agent_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint PUT /agents/{agent_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/tools", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /tools is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/folders", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /folders is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/folders", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /folders is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PUT", - "path": "/folders/{folder_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint PUT /folders/{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/folders/{folder_id}", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /folders/{folder_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/conversations/{conversation_id}/stream", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /conversations/{conversation_id}/stream is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/conversations/{conversation_id}/messages", - "file": "plugins/builtins/ai_assistant/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /conversations/{conversation_id}/messages is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "PATCH", - "path": "/{tag_id}", - "file": "plugins/builtins/tags/routes.py", - "severity": "LOW", - "message": "Backend endpoint PATCH /{tag_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/assign", - "file": "plugins/builtins/tags/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /assign is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/assign", - "file": "plugins/builtins/tags/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /assign is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/{tag_id}", - "file": "plugins/builtins/tags/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /{tag_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/bulk-assign", - "file": "plugins/builtins/tags/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /bulk-assign is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/{tag_id}/entities", - "file": "plugins/builtins/tags/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /{tag_id}/entities is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/files/{file_id}/permissions", + "path": "/api/public/share/{token}", "file": "plugins/builtins/permissions/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /files/{file_id}/permissions is never called by frontend" + "message": "Backend endpoint GET /api/public/share/{token} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/files/{file_id}/permissions", + "path": "/api/public/share/{token}", "file": "plugins/builtins/permissions/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /files/{file_id}/permissions is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/files/{file_id}/permissions/{user_id}", - "file": "plugins/builtins/permissions/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /files/{file_id}/permissions/{user_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/files/{file_id}/share-link", - "file": "plugins/builtins/permissions/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /files/{file_id}/share-link is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "DELETE", - "path": "/share-links/{link_id}", - "file": "plugins/builtins/permissions/routes.py", - "severity": "LOW", - "message": "Backend endpoint DELETE /share-links/{link_id} is never called by frontend" + "message": "Backend endpoint POST /api/public/share/{token} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{token}", + "path": "/api/v1/public/share/{token}", "file": "plugins/builtins/permissions/public_routes.py", "severity": "LOW", - "message": "Backend endpoint GET /{token} is never called by frontend" + "message": "Backend endpoint GET /api/v1/public/share/{token} is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/{token}/verify", + "path": "/api/v1/public/share/{token}/verify", "file": "plugins/builtins/permissions/public_routes.py", "severity": "LOW", - "message": "Backend endpoint POST /{token}/verify is never called by frontend" + "message": "Backend endpoint POST /api/v1/public/share/{token}/verify is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/{token}/download", + "path": "/api/v1/public/share/{token}/download", "file": "plugins/builtins/permissions/public_routes.py", "severity": "LOW", - "message": "Backend endpoint GET /{token}/download is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/tools", - "file": "plugins/builtins/mcp_server/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /tools is never called by frontend" + "message": "Backend endpoint GET /api/v1/public/share/{token}/download is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "POST", - "path": "/tools/{tool_name}/execute", - "file": "plugins/builtins/mcp_server/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /tools/{tool_name}/execute is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/config", - "file": "plugins/builtins/mcp_server/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /config is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/command", + "path": "/api/v1/ai-ui-control/command", "file": "plugins/builtins/ai_ui_control/routes.py", "severity": "LOW", - "message": "Backend endpoint POST /command is never called by frontend" + "message": "Backend endpoint POST /api/v1/ai-ui-control/command is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/command/{command_id}/status", + "path": "/api/v1/ai-ui-control/command/{command_id}/status", "file": "plugins/builtins/ai_ui_control/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /command/{command_id}/status is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai-ui-control/command/{command_id}/status is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/online-users", + "path": "/api/v1/ai-ui-control/online-users", "file": "plugins/builtins/ai_ui_control/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /online-users is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/signals/collect", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /signals/collect is never called by frontend" + "message": "Backend endpoint GET /api/v1/ai-ui-control/online-users is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/signals", + "path": "/api/v1/improvement/signals", "file": "plugins/builtins/self_improvement/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /signals is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/patterns/detect", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /patterns/detect is never called by frontend" + "message": "Backend endpoint GET /api/v1/improvement/signals is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/patterns", + "path": "/api/v1/improvement/patterns", "file": "plugins/builtins/self_improvement/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /patterns is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/proposals", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /proposals is never called by frontend" + "message": "Backend endpoint GET /api/v1/improvement/patterns is never called by frontend" }, { "type": "backend_endpoint_no_frontend", "method": "GET", - "path": "/proposals", + "path": "/api/v1/improvement/proposals", "file": "plugins/builtins/self_improvement/routes.py", "severity": "LOW", - "message": "Backend endpoint GET /proposals is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "GET", - "path": "/proposals/{proposal_id}", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint GET /proposals/{proposal_id} is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/proposals/{proposal_id}/evaluate", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /proposals/{proposal_id}/evaluate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/proposals/{proposal_id}/request-approval", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /proposals/{proposal_id}/request-approval is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/proposals/{proposal_id}/activate", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /proposals/{proposal_id}/activate is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/proposals/{proposal_id}/rollback", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /proposals/{proposal_id}/rollback is never called by frontend" - }, - { - "type": "backend_endpoint_no_frontend", - "method": "POST", - "path": "/proposals/{proposal_id}/measure", - "file": "plugins/builtins/self_improvement/routes.py", - "severity": "LOW", - "message": "Backend endpoint POST /proposals/{proposal_id}/measure is never called by frontend" + "message": "Backend endpoint GET /api/v1/improvement/proposals is never called by frontend" } ], "summary": { "total_frontend_calls": 405, - "total_backend_endpoints": 478, - "total_issues": 859, - "high_severity": 392, - "low_severity": 467 + "total_backend_endpoints": 556, + "total_issues": 218, + "high_severity": 22, + "low_severity": 196 } } \ No newline at end of file diff --git a/scripts/test_suite/results_trace_contracts.json b/scripts/test_suite/results_trace_contracts.json index c922920..ce1c9bd 100644 --- a/scripts/test_suite/results_trace_contracts.json +++ b/scripts/test_suite/results_trace_contracts.json @@ -101,6 +101,13 @@ "file": "app/plugins/builtins/tests/test_contracts.py", "attributes": [] }, + { + "name": "ContactsContract", + "file": "app/plugins/builtins/contacts/contracts.py", + "attributes": [ + "contract_name" + ] + }, { "name": "TasksContract", "file": "app/plugins/builtins/tasks/contracts.py", @@ -137,6 +144,7 @@ "find_similar_all_types", "get_search_registry", "llm_analyze_query", + "simple_search", "BaseSearchProvider" ] }, @@ -192,6 +200,7 @@ "get_messages", "send_message", "create_plugin_room", + "find_locked_room_id", "get_participant_registry", "ParticipantHandler", "MiniAppRegistry", @@ -321,11 +330,6 @@ "contract": "DmsContract", "attribute": "DmsFile", "file": "app/plugins/builtins/permissions/public_routes.py" - }, - { - "contract": "KommunikationContract", - "attribute": "send_message", - "file": "app/plugins/builtins/self_improvement/services.py" } ], "mismatches": [] diff --git a/scripts/test_suite/results_trace_functions.json b/scripts/test_suite/results_trace_functions.json index ca54a4e..00c508a 100644 --- a/scripts/test_suite/results_trace_functions.json +++ b/scripts/test_suite/results_trace_functions.json @@ -1,8 +1,8 @@ { - "py_defs": 1773, - "py_dead": 692, - "ts_defs": 1020, - "ts_dead": 457, + "py_defs": 1783, + "py_dead": 691, + "ts_defs": 1022, + "ts_dead": 453, "critical_dead": [ { "name": "seed_default_workspace", diff --git a/scripts/test_suite/results_trace_hooks.json b/scripts/test_suite/results_trace_hooks.json index c5aeeef..11e8a83 100644 --- a/scripts/test_suite/results_trace_hooks.json +++ b/scripts/test_suite/results_trace_hooks.json @@ -32,10 +32,6 @@ "file": "app/plugins/builtins/mail/plugin.py", "hook_name": "mail.after_delete" }, - { - "file": "app/plugins/builtins/wiki/plugin.py", - "hook_name": "wiki" - }, { "file": "app/plugins/builtins/contacts/plugin.py", "hook_name": "contact.after_create" @@ -79,37 +75,9 @@ { "file": "app/plugins/builtins/knowledge/plugin.py", "hook_name": "wiki.article.updated" - }, - { - "file": "app/plugins/builtins/knowledge/plugin.py", - "hook_name": "knowledge" } ], "triggers": [ - { - "file": "app/routes/companies.py", - "hook_name": "company.before_create" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.after_create" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.before_update" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.after_update" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.before_delete" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.after_delete" - }, { "file": "app/ai/agent_loop.py", "hook_name": "agent.step" @@ -298,6 +266,30 @@ "file": "app/plugins/builtins/mail/services.py", "hook_name": "mail.before_send" }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.before_create" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.after_create" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.before_update" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.after_update" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.before_delete" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.after_delete" + }, { "file": "app/plugins/builtins/tasks/services.py", "hook_name": "task.before_create" @@ -432,10 +424,6 @@ } ], "orphan_registrations": [ - { - "file": "app/plugins/builtins/wiki/plugin.py", - "hook_name": "wiki" - }, { "file": "app/plugins/builtins/knowledge/plugin.py", "hook_name": "wiki.article.created" @@ -443,37 +431,9 @@ { "file": "app/plugins/builtins/knowledge/plugin.py", "hook_name": "wiki.article.updated" - }, - { - "file": "app/plugins/builtins/knowledge/plugin.py", - "hook_name": "knowledge" } ], "orphan_triggers": [ - { - "file": "app/routes/companies.py", - "hook_name": "company.before_create" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.after_create" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.before_update" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.after_update" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.before_delete" - }, - { - "file": "app/routes/companies.py", - "hook_name": "company.after_delete" - }, { "file": "app/ai/agent_loop.py", "hook_name": "agent.step" @@ -606,6 +566,30 @@ "file": "app/plugins/builtins/mail/services.py", "hook_name": "mail.before_send" }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.before_create" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.after_create" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.before_update" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.after_update" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.before_delete" + }, + { + "file": "app/plugins/builtins/contacts/company_routes.py", + "hook_name": "company.after_delete" + }, { "file": "app/plugins/builtins/tasks/services.py", "hook_name": "task.before_create" diff --git a/scripts/test_suite/results_trace_imports.json b/scripts/test_suite/results_trace_imports.json index f24a07c..e764be4 100644 --- a/scripts/test_suite/results_trace_imports.json +++ b/scripts/test_suite/results_trace_imports.json @@ -1,40 +1,4 @@ { - "total_imports": 2556, - "broken": [ - { - "file": "app/workflows/step_handlers.py", - "module": "app.services.company_service", - "name": "create_company", - "line": 447, - "issue": "Module not found" - }, - { - "file": "app/workflows/step_handlers.py", - "module": "app.services.company_service", - "name": "update_company", - "line": 451, - "issue": "Module not found" - }, - { - "file": "app/routes/workflows.py", - "module": "app.core.approval", - "name": "decide_approval", - "line": 476, - "issue": "Name 'decide_approval' not found in module" - }, - { - "file": "app/routes/workflows.py", - "module": "app.core.approval", - "name": "decide_approval", - "line": 539, - "issue": "Name 'decide_approval' not found in module" - }, - { - "file": "app/core/auth.py", - "module": "app.models.session", - "name": "SessionModel", - "line": 261, - "issue": "Name 'SessionModel' not found in module" - } - ] + "total_imports": 2568, + "broken": [] } \ No newline at end of file diff --git a/scripts/test_suite/results_trace_plugins.json b/scripts/test_suite/results_trace_plugins.json index 8894de0..78ae5a0 100644 --- a/scripts/test_suite/results_trace_plugins.json +++ b/scripts/test_suite/results_trace_plugins.json @@ -3,137 +3,161 @@ { "name": "mcp_client", "path": "app/plugins/builtins/mcp_client", - "has_manifest": false + "has_manifest": true }, { "name": "forgejo_error_reporter", "path": "app/plugins/builtins/forgejo_error_reporter", - "has_manifest": false + "has_manifest": true }, { "name": "automation", "path": "app/plugins/builtins/automation", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true, + "has_settings_pages": true }, { "name": "dms", "path": "app/plugins/builtins/dms", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true, + "has_detail_tabs": true }, { "name": "mail", "path": "app/plugins/builtins/mail", - "has_manifest": false - }, - { - "name": "migrations", - "path": "app/plugins/builtins/migrations", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true, + "has_settings_pages": true, + "has_detail_tabs": true }, { "name": "wiki", "path": "app/plugins/builtins/wiki", - "has_manifest": false - }, - { - "name": "tests", - "path": "app/plugins/builtins/tests", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true }, { "name": "contacts", "path": "app/plugins/builtins/contacts", - "has_manifest": false + "has_manifest": true }, { "name": "tasks", "path": "app/plugins/builtins/tasks", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true }, { "name": "calendar", "path": "app/plugins/builtins/calendar", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true, + "has_detail_tabs": true }, { "name": "unified_search", "path": "app/plugins/builtins/unified_search", - "has_manifest": false + "has_manifest": true, + "has_page_routes": true }, { "name": "agent_memory", "path": "app/plugins/builtins/agent_memory", - "has_manifest": false + "has_manifest": true }, { "name": "marketplace", "path": "app/plugins/builtins/marketplace", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true, + "has_settings_pages": true, + "has_detail_tabs": true }, { "name": "graph_rag", "path": "app/plugins/builtins/graph_rag", - "has_manifest": false + "has_manifest": true }, { "name": "report_generator", "path": "app/plugins/builtins/report_generator", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true }, { "name": "system_notif", "path": "app/plugins/builtins/system_notif", - "has_manifest": false + "has_manifest": true, + "has_settings_pages": true }, { "name": "knowledge", "path": "app/plugins/builtins/knowledge", - "has_manifest": false + "has_manifest": true }, { "name": "entity_links", "path": "app/plugins/builtins/entity_links", - "has_manifest": false + "has_manifest": true, + "has_detail_tabs": true }, { "name": "kommunikation", "path": "app/plugins/builtins/kommunikation", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true }, { "name": "ai_proactive", "path": "app/plugins/builtins/ai_proactive", - "has_manifest": false + "has_manifest": true, + "has_settings_pages": true }, { "name": "ai_assistant", "path": "app/plugins/builtins/ai_assistant", - "has_manifest": false + "has_manifest": true, + "has_menu_items": true, + "has_page_routes": true, + "has_settings_pages": true }, { "name": "tags", "path": "app/plugins/builtins/tags", - "has_manifest": false + "has_manifest": true, + "has_detail_tabs": true }, { "name": "permissions", "path": "app/plugins/builtins/permissions", - "has_manifest": false + "has_manifest": true, + "has_settings_pages": true }, { "name": "mcp_server", "path": "app/plugins/builtins/mcp_server", - "has_manifest": false + "has_manifest": true }, { "name": "ai_ui_control", "path": "app/plugins/builtins/ai_ui_control", - "has_manifest": false + "has_manifest": true }, { "name": "self_improvement", "path": "app/plugins/builtins/self_improvement", - "has_manifest": false + "has_manifest": true } ], "frontend_refs": {}, @@ -768,6 +792,141 @@ "path": "/categories", "file": "app/plugins/builtins/wiki/routes.py" }, + { + "method": "GET", + "path": "/export", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "GET", + "path": "/merge-history", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "GET", + "path": "/{contact_id}", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "PUT", + "path": "/{contact_id}", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "DELETE", + "path": "/{contact_id}", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "GET", + "path": "/{contact_id}/persons", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "POST", + "path": "/{contact_id}/persons", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "PUT", + "path": "/{contact_id}/persons/{person_id}", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "DELETE", + "path": "/{contact_id}/persons/{person_id}", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "POST", + "path": "/duplicates", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "POST", + "path": "/merge", + "file": "app/plugins/builtins/contacts/routes.py" + }, + { + "method": "PUT", + "path": "/{folder_id}", + "file": "app/plugins/builtins/contacts/folder_routes.py" + }, + { + "method": "DELETE", + "path": "/{folder_id}", + "file": "app/plugins/builtins/contacts/folder_routes.py" + }, + { + "method": "PUT", + "path": "/{folder_id}/reorder", + "file": "app/plugins/builtins/contacts/folder_routes.py" + }, + { + "method": "PUT", + "path": "/contacts/{contact_id}/move", + "file": "app/plugins/builtins/contacts/folder_routes.py" + }, + { + "method": "GET", + "path": "/{folder_id}/permissions", + "file": "app/plugins/builtins/contacts/folder_permission_routes.py" + }, + { + "method": "POST", + "path": "/{folder_id}/permissions", + "file": "app/plugins/builtins/contacts/folder_permission_routes.py" + }, + { + "method": "PUT", + "path": "/{folder_id}/permissions/{permission_id}", + "file": "app/plugins/builtins/contacts/folder_permission_routes.py" + }, + { + "method": "DELETE", + "path": "/{folder_id}/permissions/{permission_id}", + "file": "app/plugins/builtins/contacts/folder_permission_routes.py" + }, + { + "method": "GET", + "path": "/{folder_id}/access", + "file": "app/plugins/builtins/contacts/folder_permission_routes.py" + }, + { + "method": "GET", + "path": "/export", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, + { + "method": "GET", + "path": "/{company_id}", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, + { + "method": "PUT", + "path": "/{company_id}", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, + { + "method": "DELETE", + "path": "/{company_id}", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, + { + "method": "POST", + "path": "/{company_id}/contacts/{contact_id}", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, + { + "method": "DELETE", + "path": "/{company_id}/contacts/{contact_id}", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, + { + "method": "GET", + "path": "/{company_id}/emails", + "file": "app/plugins/builtins/contacts/company_routes.py" + }, { "method": "GET", "path": "/{task_id}", @@ -1529,141 +1688,5 @@ "file": "app/plugins/builtins/self_improvement/routes.py" } ], - "issues": [ - { - "plugin": "mcp_client", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "forgejo_error_reporter", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "automation", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "dms", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "mail", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "migrations", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "wiki", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "tests", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "contacts", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "tasks", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "calendar", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "unified_search", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "agent_memory", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "marketplace", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "graph_rag", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "report_generator", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "system_notif", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "knowledge", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "entity_links", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "kommunikation", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "ai_proactive", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "ai_assistant", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "tags", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "permissions", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "mcp_server", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "ai_ui_control", - "issue": "No manifest.py", - "severity": "HIGH" - }, - { - "plugin": "self_improvement", - "issue": "No manifest.py", - "severity": "HIGH" - } - ] + "issues": [] } \ No newline at end of file diff --git a/scripts/test_suite/results_trace_stores.json b/scripts/test_suite/results_trace_stores.json index 4243f1a..02e7e33 100644 --- a/scripts/test_suite/results_trace_stores.json +++ b/scripts/test_suite/results_trace_stores.json @@ -1,701 +1,701 @@ { "stores": { "calendarStore": [ - "goToNextDay", - "goToToday", - "setVisibleWeek", - "calendars", - "rangeStart", - "setVisibleDay", - "visibleCalendarIds", - "viewMode", - "setRangeStart", - "setActiveCalendarId", - "visibleMonth", - "goToPrevMonth", - "goToPrevWeek", - "setCalendars", - "entry", - "activeCalendarId", - "selectedEntry", - "toggleCalendarVisibility", - "visibleWeek", - "mode", - "goToNextMonth", - "rangeEnd", "setSelectedEntry", + "activeCalendarId", + "setRangeStart", + "goToToday", + "rangeStart", + "date", + "viewMode", "visibleDay", + "goToNextMonth", + "setActiveCalendarId", + "visibleWeek", + "goToPrevWeek", + "visibleMonth", + "setVisibleMonth", + "entry", + "goToPrevMonth", "setRangeEnd", + "calendars", + "goToNextDay", + "rangeEnd", + "selectedEntry", + "visibleCalendarIds", + "setVisibleDay", + "setVisibleWeek", + "mode", + "goToPrevDay", + "toggleCalendarVisibility", "goToNextWeek", "setViewMode", - "goToPrevDay", - "date", - "setVisibleMonth" + "setCalendars" ], "aiUIControlStore": [ "feedback", - "pendingFilter", - "addCommandToHistory", - "setActiveModal", - "clearPending", - "status", - "lastFeedback", - "command_id", - "section", - "active", - "activeTab", - "settings", "entity", - "modal", - "connected", - "activeCommand", "activeModal", - "value", - "setAIActive", - "setPendingSettings", - "pendingSettings", - "setActiveTab", - "commandHistory", - "setConnected", - "setPendingFilter", - "action", - "setActiveCommand", "filter", + "clearPending", + "activeTab", + "section", + "action", + "addCommandToHistory", + "settings", + "connected", + "lastFeedback", + "commandHistory", "aiActive", - "setLastFeedback" + "setActiveCommand", + "setActiveModal", + "setPendingFilter", + "activeCommand", + "command_id", + "status", + "setPendingSettings", + "setAIActive", + "pendingSettings", + "modal", + "setConnected", + "setLastFeedback", + "pendingFilter", + "value", + "active", + "setActiveTab" ], "onboardingStore": [ - "completed", - "prev", - "complete", - "next", - "skip", - "data", - "isActive", - "step", + "start", "skipped", - "reset", + "isActive", + "complete", + "completed", + "step", + "data", "goToStep", - "start" + "prev", + "reset", + "next", + "skip" ], "windowStore": [ - "height", - "closeWindow", - "activeWindowId", - "title", - "width", - "type", - "aiChatVisible", - "setActiveWindow", - "config", - "windows", - "const", - "component", - "toggleAiChat", - "componentProps", - "position", - "updateWindowSize", - "updateWindowPosition", - "zIndex", - "openWindow", - "toggleFullscreen", - "size", - "null", - "newWindow", - "restoreWindow", "nextZIndex", - "minimizeWindow" + "size", + "config", + "position", + "component", + "restoreWindow", + "toggleAiChat", + "title", + "aiChatVisible", + "height", + "newWindow", + "zIndex", + "type", + "setActiveWindow", + "componentProps", + "openWindow", + "activeWindowId", + "const", + "null", + "toggleFullscreen", + "updateWindowPosition", + "width", + "closeWindow", + "windows", + "minimizeWindow", + "updateWindowSize" ], "commandPaletteStore": [ "close", - "isOpen", "toggle", + "isOpen", "open" ], "pluginToolbarStore": [ - "registerItems", - "unregisterPlugin", - "value", - "activePlugin", - "items", - "updates", "null", - "query", - "label", - "updateItem", "onClick", + "activePlugin", + "unregisterPlugin", "setActivePlugin", - "plugin" + "registerItems", + "value", + "plugin", + "updateItem", + "items", + "label", + "query", + "updates" ], "commStore": [ - "display_name", - "participant_id", - "addMessage", - "file_id", - "file_source", - "last_msg_sender_type", - "attachments", - "conversations", - "is_archived", - "sender_id", - "setTyping", - "reactions", - "created_by_type", - "setMessages", - "title", - "block_data", - "conv", - "participant_type", - "participants", - "unreadCounts", - "is_locked", - "file_type", - "blocks", - "content_format", - "setUnread", - "last_msg_at", - "created_at", - "last_msg_preview", - "messages", - "loading", - "count", - "role", - "edited_at", - "convs", - "setLoading", - "created_by", - "setActiveConversation", - "is_direct", - "thumbnail_path", - "reply_to_id", - "msgs", - "convId", - "conversation_id", - "userIds", - "activeConversationId", - "block_type", - "sort_order", - "file_size", - "file_name", - "typingUsers", - "unread_count", "sender_type", - "is_pinned", - "locked_by", - "updateConversation", + "setTyping", + "setLoading", "setConversations", + "last_msg_sender_type", + "file_size", + "block_data", + "file_id", + "last_msg_at", + "is_pinned", + "setActiveConversation", + "addMessage", + "created_by_type", + "block_type", + "role", + "is_locked", + "created_by", + "conv", + "userIds", + "edited_at", + "file_source", + "blocks", + "participants", + "title", + "setMessages", + "sort_order", + "count", + "reply_to_id", + "participant_type", "metadata", - "content" + "messages", + "activeConversationId", + "last_msg_preview", + "reactions", + "setUnread", + "file_type", + "locked_by", + "msgs", + "display_name", + "thumbnail_path", + "typingUsers", + "updateConversation", + "loading", + "sender_id", + "content", + "convId", + "convs", + "is_direct", + "content_format", + "is_archived", + "created_at", + "unread_count", + "file_name", + "participant_id", + "conversation_id", + "attachments", + "unreadCounts", + "conversations" ], "pluginStore": [ - "display_name", - "order", - "field_type", - "group", - "label_key", - "label", - "badge_key", - "col_span", - "dashboard_widgets", - "error", - "loaded", - "settings_pages", - "path", - "version", - "getAllMenuItems", - "protected", - "getCustomFieldsForEntity", - "options", "default_value", - "is_core", + "getAllMenuItems", + "getAllDashboardWidgets", + "entity", + "settings_pages", + "getAllSettingsPages", + "col_span", + "detail_tabs", "parent", "setManifests", - "setError", - "entity", - "custom_fields", - "reset", - "required", - "loading", - "entityType", - "component", - "menu_items", - "setLoading", - "icon", - "page_routes", - "getAllDashboardWidgets", - "getAllPageRoutes", - "getAllSettingsPages", - "manifests", - "row_span", "entity_type", + "page_routes", + "component", "permission", + "version", + "entityType", + "badge_key", + "getCustomFieldsForEntity", + "group", + "label", + "order", + "loaded", + "options", + "path", + "manifests", "getDetailTabsForEntity", - "detail_tabs" + "custom_fields", + "dashboard_widgets", + "is_core", + "field_type", + "display_name", + "reset", + "loading", + "getAllPageRoutes", + "icon", + "required", + "menu_items", + "protected", + "row_span", + "error", + "setLoading", + "setError", + "label_key" ], "themeStore": [ - "darkMode", - "scales", - "result", - "fontFamily", - "base", - "setTheme", - "config", "accentColor", + "loadFromStorage", "amount", "applyTheme", + "fontFamily", "borderRadius", - "loadFromStorage", - "primaryColor", - "toggleDarkMode", + "saveToStorage", + "result", "DEFAULT_THEME", + "setTheme", + "primaryColor", "target", - "saveToStorage" + "base", + "config", + "toggleDarkMode", + "darkMode", + "scales" ], "uiStore": [ - "addToast", - "index", - "notifications", - "toast", - "removeToast", - "type", - "setTheme", - "setAISidebarTab", - "openAISidebarProactive", - "sidebarOpen", - "collapsed", - "toggleSuggestionSidebar", - "messageSidebarCollapsed", - "suggestionSidebarOpen", - "locale", - "aiSidebarCollapsed", - "setAISidebarCollapsed", - "toggleAISidebar", - "setLocale", - "open", - "toasts", - "aiSidebarTab", "setMessageSidebarCollapsed", - "toggleMessageSidebar", - "removeNotification", - "toggleSidebar", - "clearNotifications", + "toasts", + "index", + "open", + "toast", + "collapsed", + "messageSidebarCollapsed", + "setAISidebarTab", + "aiSidebarCollapsed", + "openAISidebarProactive", + "removeToast", "message", - "theme", + "setTheme", + "removeNotification", "setSidebarOpen", - "clearToasts" + "type", + "toggleMessageSidebar", + "clearToasts", + "theme", + "clearNotifications", + "addToast", + "setAISidebarCollapsed", + "locale", + "setLocale", + "aiSidebarTab", + "toggleAISidebar", + "notifications", + "toggleSuggestionSidebar", + "toggleSidebar", + "sidebarOpen", + "suggestionSidebarOpen" ], "workspaceStore": [ - "height", - "setMyWorkspaces", - "hasWorkspaces", - "widget_key", - "workspaces", "is_visible", - "visibleModuleKeys", - "position_x", - "workspace_id", - "module_key", - "modules", - "width", - "context", - "menu_order", + "is_default", "config", + "visibleModuleKeys", + "context", + "position_y", + "hasWorkspaces", "isLoading", + "setActiveWorkspace", + "workspace_id", + "height", + "setContext", + "module_key", + "is_active", + "isModuleVisible", + "workspaces", + "activeWorkspaceId", + "widgets", "reset", "loading", - "is_default", - "description", - "widgets", - "isModuleVisible", - "is_active", - "setLoading", "myWorkspaces", + "position_x", "icon", - "position_y", - "activeWorkspaceId", - "setContext", + "menu_order", + "setMyWorkspaces", "moduleKey", - "setActiveWorkspace" + "width", + "setLoading", + "description", + "widget_key", + "modules" ], "authStore": [ - "setUser", - "tenant", - "slug", - "error", - "user", - "logout", - "is_system_admin", - "fieldPerms", - "perms", - "setError", - "isLoading", - "setTenant", - "loading", "tenants", - "authed", - "role", - "isSystemAdmin", - "setAuthenticated", - "setLoading", - "permissions", - "currentTenant", - "isAuthenticated", - "setPermissions", - "email", - "avatar_url", + "slug", "last_name", + "role", + "setPermissions", + "isSystemAdmin", + "avatar_url", + "setTenant", + "logout", + "isLoading", + "is_system_admin", + "perms", + "isAuthenticated", + "user", + "setAuthenticated", + "currentTenant", + "fieldPerms", + "loading", + "tenant", + "email", + "setUser", + "field_permissions", + "error", + "setLoading", + "setError", + "authed", "first_name", - "field_permissions" + "permissions" ] }, "usage": {}, "unused": { "calendarStore": [ - "goToNextDay", - "goToToday", - "setVisibleWeek", - "calendars", - "rangeStart", - "setVisibleDay", - "visibleCalendarIds", - "viewMode", - "setRangeStart", - "setActiveCalendarId", - "visibleMonth", - "goToPrevMonth", - "goToPrevWeek", - "setCalendars", - "entry", - "activeCalendarId", - "selectedEntry", - "toggleCalendarVisibility", - "visibleWeek", - "mode", - "goToNextMonth", - "rangeEnd", "setSelectedEntry", + "activeCalendarId", + "setRangeStart", + "goToToday", + "rangeStart", + "date", + "viewMode", "visibleDay", + "goToNextMonth", + "setActiveCalendarId", + "visibleWeek", + "goToPrevWeek", + "visibleMonth", + "setVisibleMonth", + "entry", + "goToPrevMonth", "setRangeEnd", + "calendars", + "goToNextDay", + "rangeEnd", + "selectedEntry", + "visibleCalendarIds", + "setVisibleDay", + "setVisibleWeek", + "mode", + "goToPrevDay", + "toggleCalendarVisibility", "goToNextWeek", "setViewMode", - "goToPrevDay", - "date", - "setVisibleMonth" + "setCalendars" ], "aiUIControlStore": [ "feedback", - "pendingFilter", - "addCommandToHistory", - "setActiveModal", - "clearPending", - "status", - "lastFeedback", - "command_id", - "section", - "active", - "activeTab", - "settings", "entity", - "modal", - "connected", - "activeCommand", "activeModal", - "value", - "setAIActive", - "setPendingSettings", - "pendingSettings", - "setActiveTab", - "commandHistory", - "setConnected", - "setPendingFilter", - "action", - "setActiveCommand", "filter", + "clearPending", + "activeTab", + "section", + "action", + "addCommandToHistory", + "settings", + "connected", + "lastFeedback", + "commandHistory", "aiActive", - "setLastFeedback" + "setActiveCommand", + "setActiveModal", + "setPendingFilter", + "activeCommand", + "command_id", + "status", + "setPendingSettings", + "setAIActive", + "pendingSettings", + "modal", + "setConnected", + "setLastFeedback", + "pendingFilter", + "value", + "active", + "setActiveTab" ], "onboardingStore": [ - "completed", - "prev", - "complete", - "next", - "skip", - "data", - "isActive", - "step", + "start", "skipped", - "reset", + "isActive", + "complete", + "completed", + "step", + "data", "goToStep", - "start" + "prev", + "reset", + "next", + "skip" ], "windowStore": [ - "height", - "closeWindow", - "activeWindowId", - "title", - "width", - "type", - "aiChatVisible", - "setActiveWindow", - "config", - "windows", - "const", - "component", - "toggleAiChat", - "componentProps", - "position", - "updateWindowSize", - "updateWindowPosition", - "zIndex", - "openWindow", - "toggleFullscreen", - "size", - "null", - "newWindow", - "restoreWindow", "nextZIndex", - "minimizeWindow" + "size", + "config", + "position", + "component", + "restoreWindow", + "toggleAiChat", + "title", + "aiChatVisible", + "height", + "newWindow", + "zIndex", + "type", + "setActiveWindow", + "componentProps", + "openWindow", + "activeWindowId", + "const", + "null", + "toggleFullscreen", + "updateWindowPosition", + "width", + "closeWindow", + "windows", + "minimizeWindow", + "updateWindowSize" ], "commandPaletteStore": [ "close", - "isOpen", "toggle", + "isOpen", "open" ], "pluginToolbarStore": [ - "registerItems", - "unregisterPlugin", - "value", - "activePlugin", - "items", - "updates", "null", - "query", - "label", - "updateItem", "onClick", + "activePlugin", + "unregisterPlugin", "setActivePlugin", - "plugin" + "registerItems", + "value", + "plugin", + "updateItem", + "items", + "label", + "query", + "updates" ], "commStore": [ - "display_name", - "participant_id", - "addMessage", - "file_id", - "file_source", - "last_msg_sender_type", - "attachments", - "conversations", - "is_archived", - "sender_id", - "setTyping", - "reactions", - "created_by_type", - "setMessages", - "title", - "block_data", - "conv", - "participant_type", - "participants", - "unreadCounts", - "is_locked", - "file_type", - "blocks", - "content_format", - "setUnread", - "last_msg_at", - "created_at", - "last_msg_preview", - "messages", - "loading", - "count", - "role", - "edited_at", - "convs", - "setLoading", - "created_by", - "setActiveConversation", - "is_direct", - "thumbnail_path", - "reply_to_id", - "msgs", - "convId", - "conversation_id", - "userIds", - "activeConversationId", - "block_type", - "sort_order", - "file_size", - "file_name", - "typingUsers", - "unread_count", "sender_type", - "is_pinned", - "locked_by", - "updateConversation", + "setTyping", + "setLoading", "setConversations", + "last_msg_sender_type", + "file_size", + "block_data", + "file_id", + "last_msg_at", + "is_pinned", + "setActiveConversation", + "addMessage", + "created_by_type", + "block_type", + "role", + "is_locked", + "created_by", + "conv", + "userIds", + "edited_at", + "file_source", + "blocks", + "participants", + "title", + "setMessages", + "sort_order", + "count", + "reply_to_id", + "participant_type", "metadata", - "content" + "messages", + "activeConversationId", + "last_msg_preview", + "reactions", + "setUnread", + "file_type", + "locked_by", + "msgs", + "display_name", + "thumbnail_path", + "typingUsers", + "updateConversation", + "loading", + "sender_id", + "content", + "convId", + "convs", + "is_direct", + "content_format", + "is_archived", + "created_at", + "unread_count", + "file_name", + "participant_id", + "conversation_id", + "attachments", + "unreadCounts", + "conversations" ], "pluginStore": [ - "display_name", - "order", - "field_type", - "group", - "label_key", - "label", - "badge_key", - "col_span", - "dashboard_widgets", - "error", - "loaded", - "settings_pages", - "path", - "version", - "getAllMenuItems", - "protected", - "getCustomFieldsForEntity", - "options", "default_value", - "is_core", + "getAllMenuItems", + "getAllDashboardWidgets", + "entity", + "settings_pages", + "getAllSettingsPages", + "col_span", + "detail_tabs", "parent", "setManifests", - "setError", - "entity", - "custom_fields", - "reset", - "required", - "loading", - "entityType", - "component", - "menu_items", - "setLoading", - "icon", - "page_routes", - "getAllDashboardWidgets", - "getAllPageRoutes", - "getAllSettingsPages", - "manifests", - "row_span", "entity_type", + "page_routes", + "component", "permission", + "version", + "entityType", + "badge_key", + "getCustomFieldsForEntity", + "group", + "label", + "order", + "loaded", + "options", + "path", + "manifests", "getDetailTabsForEntity", - "detail_tabs" + "custom_fields", + "dashboard_widgets", + "is_core", + "field_type", + "display_name", + "reset", + "loading", + "getAllPageRoutes", + "icon", + "required", + "menu_items", + "protected", + "row_span", + "error", + "setLoading", + "setError", + "label_key" ], "themeStore": [ - "darkMode", - "scales", - "result", - "fontFamily", - "base", - "setTheme", - "config", "accentColor", + "loadFromStorage", "amount", "applyTheme", + "fontFamily", "borderRadius", - "loadFromStorage", - "primaryColor", - "toggleDarkMode", + "saveToStorage", + "result", "DEFAULT_THEME", + "setTheme", + "primaryColor", "target", - "saveToStorage" + "base", + "config", + "toggleDarkMode", + "darkMode", + "scales" ], "uiStore": [ - "addToast", - "index", - "notifications", - "toast", - "removeToast", - "type", - "setTheme", - "setAISidebarTab", - "openAISidebarProactive", - "sidebarOpen", - "collapsed", - "toggleSuggestionSidebar", - "messageSidebarCollapsed", - "suggestionSidebarOpen", - "locale", - "aiSidebarCollapsed", - "setAISidebarCollapsed", - "toggleAISidebar", - "setLocale", - "open", - "toasts", - "aiSidebarTab", "setMessageSidebarCollapsed", - "toggleMessageSidebar", - "removeNotification", - "toggleSidebar", - "clearNotifications", + "toasts", + "index", + "open", + "toast", + "collapsed", + "messageSidebarCollapsed", + "setAISidebarTab", + "aiSidebarCollapsed", + "openAISidebarProactive", + "removeToast", "message", - "theme", + "setTheme", + "removeNotification", "setSidebarOpen", - "clearToasts" + "type", + "toggleMessageSidebar", + "clearToasts", + "theme", + "clearNotifications", + "addToast", + "setAISidebarCollapsed", + "locale", + "setLocale", + "aiSidebarTab", + "toggleAISidebar", + "notifications", + "toggleSuggestionSidebar", + "toggleSidebar", + "sidebarOpen", + "suggestionSidebarOpen" ], "workspaceStore": [ - "height", - "setMyWorkspaces", - "hasWorkspaces", - "widget_key", - "workspaces", "is_visible", - "visibleModuleKeys", - "position_x", - "workspace_id", - "module_key", - "modules", - "width", - "context", - "menu_order", + "is_default", "config", + "visibleModuleKeys", + "context", + "position_y", + "hasWorkspaces", "isLoading", + "setActiveWorkspace", + "workspace_id", + "height", + "setContext", + "module_key", + "is_active", + "isModuleVisible", + "workspaces", + "activeWorkspaceId", + "widgets", "reset", "loading", - "is_default", - "description", - "widgets", - "isModuleVisible", - "is_active", - "setLoading", "myWorkspaces", + "position_x", "icon", - "position_y", - "activeWorkspaceId", - "setContext", + "menu_order", + "setMyWorkspaces", "moduleKey", - "setActiveWorkspace" + "width", + "setLoading", + "description", + "widget_key", + "modules" ], "authStore": [ - "setUser", - "tenant", - "slug", - "error", - "user", - "logout", - "is_system_admin", - "fieldPerms", - "perms", - "setError", - "isLoading", - "setTenant", - "loading", "tenants", - "authed", - "role", - "isSystemAdmin", - "setAuthenticated", - "setLoading", - "permissions", - "currentTenant", - "isAuthenticated", - "setPermissions", - "email", - "avatar_url", + "slug", "last_name", + "role", + "setPermissions", + "isSystemAdmin", + "avatar_url", + "setTenant", + "logout", + "isLoading", + "is_system_admin", + "perms", + "isAuthenticated", + "user", + "setAuthenticated", + "currentTenant", + "fieldPerms", + "loading", + "tenant", + "email", + "setUser", + "field_permissions", + "error", + "setLoading", + "setError", + "authed", "first_name", - "field_permissions" + "permissions" ] } } \ No newline at end of file diff --git a/scripts/test_suite/trace_api_contracts.py b/scripts/test_suite/trace_api_contracts.py index 5461766..e84a81d 100644 --- a/scripts/test_suite/trace_api_contracts.py +++ b/scripts/test_suite/trace_api_contracts.py @@ -138,50 +138,62 @@ def find_backend_response_fields() -> list[dict]: return responses +def _router_prefixes(content: str) -> dict[str, str]: + """Extract all router variable definitions with their APIRouter prefixes. + + Modules may define multiple routers (e.g. ``router``, ``calendar_router``, + ``resource_router``) each with its own prefix. + """ + prefixes: dict[str, str] = {} + for m in re.finditer( + r"(\w+)\s*=\s*APIRouter\([^)]*?prefix\s*=\s*[\"']([^\"']+)[\"']", content + ): + prefixes[m.group(1)] = m.group(2).rstrip("/") + return prefixes + + def find_backend_endpoints() -> list[dict]: - """Find all backend endpoints from route decorators.""" + """Find all backend endpoints from route decorators. + + Includes the module's APIRouter prefix so paths are comparable with + frontend calls (which use full /api/v1/... URLs). + """ endpoints = [] - routes_dir = BACKEND_APP / "routes" - if not routes_dir.exists(): - return endpoints + scan_dirs = [ + BACKEND_APP / "routes", + BACKEND_APP / "plugins" / "builtins", + ] - for py_file in routes_dir.rglob("*.py"): - try: - content = py_file.read_text(encoding="utf-8") - except Exception: + for scan_dir in scan_dirs: + if not scan_dir.exists(): continue - - rel_path = str(py_file.relative_to(BACKEND_APP)) - - # Find router decorators - for match in re.finditer(r"@router\.(get|post|put|patch|delete)\s*\(\s*[\"']([^\"']+)[\"']", content): - method = match.group(1).upper() - path = match.group(2) - endpoints.append({ - "file": rel_path, - "method": method, - "path": path, - }) - - # Also find plugin routes - plugins_dir = BACKEND_APP / "plugins" / "builtins" - if plugins_dir.exists(): - for py_file in plugins_dir.rglob("*.py"): + is_plugin_dir = scan_dir.name == "builtins" + for py_file in scan_dir.rglob("*.py"): try: content = py_file.read_text(encoding="utf-8") except Exception: continue rel_path = str(py_file.relative_to(BACKEND_APP)) - for match in re.finditer(r"@router\.(get|post|put|patch|delete)\s*\(\s*[\"']([^\"']+)[\"']", content): - method = match.group(1).upper() - path = match.group(2) - endpoints.append({ + prefixes = _router_prefixes(content) + + # Variable-agnostic with per-variable prefix mapping: modules may + # define multiple routers (e.g. ``calendar_router``) each with its + # own prefix. Path may be an empty string for collection routes + # (e.g. ``@router.get("")``). + for match in re.finditer(r"@(\w+)\.(get|post|put|patch|delete)\s*\(\s*[\"']([^\"']*)[\"']", content): + var_name = match.group(1) + method = match.group(2).upper() + prefix = prefixes.get(var_name, "") + path = prefix + match.group(3) + ep = { "file": rel_path, "method": method, "path": path, - "is_plugin": True, - }) + } + if is_plugin_dir: + ep["is_plugin"] = True + endpoints.append(ep) return endpoints @@ -190,9 +202,14 @@ def normalize_path(path: str) -> str: """Normalize a path for comparison.""" # Remove leading /api/v1 if present path = re.sub(r"^/api/v1/", "/", path) + # Replace JS template-literal interpolations (${qs}, ${id}, ...) like params; + # ensure a '/' separator so '/webhooks${params}' -> '/webhooks/{param}' + path = re.sub(r"([^/])\$\{[^}]*\}", r"\1/{param}", path) + path = re.sub(r"^\$\{[^}]*\}", "{param}", path) # Replace {param} patterns path = re.sub(r"\{[^}]+\}", "{param}", path) - # Remove trailing slash + # Collapse duplicate slashes and remove trailing slash + path = re.sub(r"//+", "/", path) path = path.rstrip("/") return path diff --git a/scripts/test_suite/trace_plugins.py b/scripts/test_suite/trace_plugins.py index 2220436..749b8d4 100644 --- a/scripts/test_suite/trace_plugins.py +++ b/scripts/test_suite/trace_plugins.py @@ -9,16 +9,27 @@ APP = ROOT / "app" FRONTEND = ROOT / "frontend" / "src" def find_plugin_manifests() -> list[dict]: + """Find plugin manifests. + + Project convention: manifests are defined inline in plugin.py via + ``PluginManifest(...)`` — no separate manifest.py file exists. + """ plugins = [] builtins = APP / "plugins" / "builtins" if not builtins.exists(): return plugins for d in builtins.iterdir(): if not d.is_dir() or d.name.startswith("_"): continue - manifest_file = d / "manifest.py" - plugin_info = {"name": d.name, "path": str(d.relative_to(ROOT)), "has_manifest": manifest_file.exists()} - if manifest_file.exists(): - try: content = manifest_file.read_text() + plugin_file = d / "plugin.py" + if not plugin_file.exists(): + # Not a plugin directory (e.g. migrations/, tests/) — skip silently + continue + has_manifest = False + plugin_info = {"name": d.name, "path": str(d.relative_to(ROOT)), "has_manifest": False} + if plugin_file.exists(): + try: content = plugin_file.read_text() except: continue + has_manifest = bool(re.search(r'PluginManifest\s*\(', content)) + plugin_info["has_manifest"] = has_manifest for m in re.finditer(r'menu_items\s*[=:]\s*\[', content): plugin_info["has_menu_items"] = True for m in re.finditer(r'page_routes\s*[=:]\s*\[', content): plugin_info["has_page_routes"] = True for m in re.finditer(r'settings_pages\s*[=:]\s*\[', content): plugin_info["has_settings_pages"] = True @@ -47,6 +58,16 @@ def find_plugin_routes() -> list[dict]: routes.append({"method": m.group(1).upper(), "path": m.group(2), "file": rel}) return routes + +def _has_dynamic_consumption() -> bool: + """True if the frontend consumes plugin manifests dynamically. + + The frontend fetches menu_items/page_routes via the active-manifests API + (frontend/src/api/pluginManifests.ts) and renders them through pluginStore — + static '@/plugins/' imports are therefore not required for wiring. + """ + return (FRONTEND / "api" / "pluginManifests.ts").exists() + def main(): print("=" * 70) print("TRACE PLUGINS — Plugin→Manifest→Frontend Verkabelungsfehler") @@ -57,8 +78,12 @@ def main(): issues = [] for p in plugins: if not p["has_manifest"]: - issues.append({"plugin": p["name"], "issue": "No manifest.py", "severity": "HIGH"}) - if p.get("has_menu_items") and p["name"] not in frontend_refs: + issues.append({"plugin": p["name"], "issue": "No manifest (PluginManifest in plugin.py expected)", "severity": "HIGH"}) + # NOTE: menu_items are consumed dynamically by the frontend via the + # active-manifests API (frontend/src/api/pluginManifests.ts + pluginStore), + # NOT via static '@/plugins/' imports — a missing static import is + # therefore not a wiring error. + if p.get("has_menu_items") and p["name"] not in frontend_refs and not _has_dynamic_consumption(): issues.append({"plugin": p["name"], "issue": "Has menu_items but no frontend reference", "severity": "MEDIUM"}) print(f"\nPlugins found: {len(plugins)}") print(f"Plugin routes: {len(plugin_routes)}")