feat(M1): Universal-MiniApp-Registry — Plugin-Layer, permission fail-closed, Lifecycle, /api/v1/miniapps
Check Cross-Plugin Imports / check (push) Has been cancelled

- app/plugins/miniapp_registry.py: Registry aus kommunikation in Plugin-Layer gehoben (Plattform-Konzept, hosts chat/dashboard/window)
- MiniAppDef: permission (fail-closed) + settings_schema + col/row_span + hosts + component + order + builtin
- MiniAppContribution + FrontendDashboardWidget (Manifest-Schema) um M1-Felder erweitert — dashboard_widgets ist Alias von miniapps (ein Contribution-Typ, #359-Philosophie)
- BasePlugin.on_activate: automatische Manifest-Registrierung; on_deactivate: unregister_plugin (nur eigene Apps)
- GET /api/v1/miniapps (server-seitig permission-gefiltert, ?host=) + GET /api/v1/miniapps/{app_id} (403/404 fail-closed)
- kommunikation/miniapp_registry.py = Kompatibilitaets-Bruecke (Bestands-Importer unveraendert)
- Doku: api-documentation.md + plugin-development-guide.md (MiniApp-Beitragsmuster)

TDD: Rot 16 failed -> Gruen 16/16; Regressionen: contracts 23/23, lifecycle+route_order 4/4; ruff clean (M1-Dateien, Vorbestand per Stash bewiesen); create_app OK
This commit is contained in:
Agent Zero
2026-08-30 13:00:33 +02:00
parent 5eade3e005
commit 84cb82d2c4
10 changed files with 664 additions and 251 deletions
+27
View File
@@ -2710,3 +2710,30 @@ class SalesContract:
Validierung + CII-XML-Generierung uebernimmt report_generator (`einvoice.py`,
EN16931 BT/BG-Pflichtfelder, kommerzielles Rounding, XRechnung-3.0-Guideline).
Kein Beitrag -> `POST /einvoice/render-for` antwortet 404 `no_data_source`.
## MiniApp-Beitrag (Phase M1 — universal, Chat + Dashboard + Windows)
MiniApps sind die universalen UI-Bausteine der Plattform. Registrierung:
1. **Manifest (deklarativ, empfohlen):** `dashboard_widgets`- oder `miniapps`-Eintraege werden bei Plugin-Aktivierung AUTOMATISCH in die Universal-Registry uebernommen (BasePlugin.on_activate). Bestehende Manifeste laufen unveraendert weiter.
2. **Programmatisch (z.B. dynamische Apps):** `get_miniapp_registry().register(...)` aus `app.plugins.miniapp_registry`.
```python
# Manifest-Beispiel (beide Formen sind gleichwertig)
dashboard_widgets=[FrontendDashboardWidget(
id="tasks_summary", label="Tasks", component="@/components/dashboard/TasksSummaryWidget",
col_span=1, row_span=1, permission="tasks:read", settings_schema={...},
)]
miniapps=[MiniAppContribution(
app_id="my_app", name="My App", permission="myplugin:read",
settings_schema={"type": "object", "properties": {...}},
hosts=["chat", "dashboard", "window"], component="@/components/myplugin/MyMiniApp",
)]
```
**Regeln:**
- `permission` wird server-seitig fail-closed gefiltert (`GET /api/v1/miniapps`, 403 bei Einzel-Lookup)
- `settings_schema` speist generische Per-Instanz-Settings-Forms (Dashboard-Builder M3)
- `hosts` beschraenkt wo die App erscheinen darf (chat/dashboard/window)
- Deaktivierung des Plugins entfernt seine MiniApps automatisch (unregister_plugin)
- Alte Chat-Registry-Imports (`kommunikation.miniapp_registry`) funktionieren ueber Kompatibilitaets-Bruecke weiter