docs(it-management): document meeting auto-import via graph

This commit is contained in:
beo3000 2026-05-06 22:05:48 +02:00
parent d15e1e447a
commit a401f4fb55
1 changed files with 138 additions and 0 deletions

View File

@ -0,0 +1,138 @@
---
tags: [it-management, integration, teams, graph]
status: aktiv
date: 2026-05-06
---
# Meeting Auto-Import via MS Graph
## Was ist das?
Erweiterung von [[Obsidian O365 Kalender Integration]]: Nach Ende eines Jour-Fixe-Meetings zieht der Befehl `/meeting-end` automatisch **Transkript** und **Copilot-Recap** aus Teams via Microsoft Graph, mergt sie mit den live mitgeschriebenen Notizen und führt die Ergebnisse in die Agenda zurück (Historie, Archiv, Postponed).
## Workflow
1. Meeting läuft in Teams (mit aktivem Facilitator → Aufzeichnung + Copilot-Recap)
2. Nach Meeting: `/meeting-end` in der Meeting-Notiz
3. Script `fetch-meeting-artifacts.js` ruft Graph API:
- `getEventById` → Event mit `seriesMasterId` + JoinUrl
- `resolveOnlineMeeting` → Teams-OnlineMeeting via JoinUrl
- `fetchTranscriptVtt` → letztes Transkript (.vtt)
- `fetchAiInsights` (Beta) → Copilot-Recap (Topics, Decisions, Action Items)
- `fetchRecordingUrl` → Recording-Link
4. Claude führt Doppel-Pass-Synthese aus: Recap + Transkript validiert
5. Sprecher-Mapping: Speaker-Namen → Personen-Wikilinks via `00 Kontext/Personen/`
6. Merge mit Live-Notizen (Live-Order bleibt, neue Items hinten)
7. Agenda-Rückführung mit Konfidenz-Heuristik:
- Topic abgeschlossen → Archiv (mit Historie)
- Topic postponed → `## ⏸️ Postponed`
- Topic offen → datierter Historie-Eintrag in Agenda
- Mehrdeutig → User-Bestätigung pro Topic
8. `recording_url` ins Frontmatter, `status: abgeschlossen`
## Komponenten
**Scripts** (`scripts/`):
- `fetch-meeting-artifacts.js` — CLI-Orchestrator (`--o365-id <id> --out <file>`)
- `lib/graph-meetings.js` — Graph-Helper für OnlineMeetings/Transcripts/aiInsights/Recordings
- `lib/vtt-parser.js` — VTT-Parser mit `<v Speaker>`-Tags, optional Cue-Merge
- `lib/speaker-matcher.js` — Speaker-Name → Person-Wikilink (wraps `person-matcher.js`)
- `lib/o365-calendar.js` — erweitert um `getEventById` + `extractJoinUrlFromBody`
- `backfill-series-id.js` — One-Shot: schreibt `o365_series_id` ins Agenda-Frontmatter
**Commands** (`.claude/commands/`):
- `meeting-end.md` — komplett neu: Auto-Import-Flow mit Konfidenz-Klassifikation
- `meeting.md` — erweitert um Lazy-Backfill von `o365_series_id`
**Frontmatter-Erweiterungen:**
- Agenda: `o365_series_id: <seriesMasterId>` (verbindet Agenda fest mit Outlook-Serie)
- Meeting-Notiz: `recording_url: <url>` (gesetzt wenn Recording vorhanden)
## Backfill-Status
| Serie | O365-Titel | `o365_series_id` |
|---|---|---|
| IT Team | "diverse IT-Themen" | ✅ gesetzt |
| LANdata | "Status Meeting KRAH / LANdata" | ✅ gesetzt |
| Andere | — | Lazy-Backfill beim ersten `/meeting <Serie>` |
## Azure-Setup
**App Registration:** OfficeAssist (`93f9f15c-b566-4ca1-9145-c23f87c7f5c7`)
Authentication: OAuth2 Client Credentials Flow (`@azure/msal-node`)
### Application Permissions (Microsoft Graph, Admin Consent)
Ergänzt am 2026-05-06:
- `OnlineMeetings.Read.All` — OnlineMeeting per JoinUrl auflösen
- `OnlineMeetingTranscript.Read.All``.vtt` lesen
- `OnlineMeetingArtifact.Read.All` — Recording-URL lesen
- `OnlineMeetingAiInsight.Read.All` — Copilot-Recap (Beta-Endpoint)
Bereits vorhanden: `Calendars.Read`, `User.Read.All`, plus Mail/Sites.
### Application Access Policy (Teams PowerShell)
**Wichtig:** Ohne diese Policy → 404 trotz korrekter Permissions. Microsoft-spezifisches Gate für Service-Apps gegen OnlineMeetings. **In Teams Admin Center UI nicht sichtbar** — nur PowerShell.
Erstellt am 2026-05-06:
```powershell
Connect-MicrosoftTeams
New-CsApplicationAccessPolicy -Identity "obsidian-graph" `
-AppIds "93f9f15c-b566-4ca1-9145-c23f87c7f5c7" `
-Description "OfficeAssist meeting auto-import"
Grant-CsApplicationAccessPolicy -PolicyName "obsidian-graph" `
-Identity "c.kauer@krah-gruppe.de"
```
Verifizierung:
```powershell
Get-CsApplicationAccessPolicy -Identity "obsidian-graph"
# erwartet: AppIds enthält 93f9f15c-...
```
Replikationszeit nach `Grant`: typisch 30-60 Min, manchmal mehrere Stunden.
### Lizenzen
- E3 + Copilot for Microsoft 365 (für Recap via aiInsights Beta-Endpoint)
- Ohne Copilot: Transkript + Recording funktionieren, Recap fällt weg
## Daten-Flow
```
Meeting endet
└─> /meeting-end
└─> fetch-meeting-artifacts.js --o365-id <id>
├─> getEventById ── Calendars.Read
├─> resolveOnlineMeeting ── OnlineMeetings.Read.All + AccessPolicy
├─> fetchTranscriptVtt ── OnlineMeetingTranscript.Read.All
├─> fetchAiInsights ── OnlineMeetingAiInsight.Read.All (Beta)
└─> fetchRecordingUrl ── OnlineMeetingArtifact.Read.All
── JSON ──>
Claude: Doppel-Pass + Speaker-Mapping + Merge + Agenda-Rückführung
└─> Meeting-Notiz + Agenda.md aktualisiert
```
## Robustheit
- Per-Artefakt-Fallback: schlägt Transcript fehl → Warning, Recap+Recording trotzdem holen
- Fehlende Permissions / fehlende Policy → graceful: Warning + leere Felder, kein Crash
- Recap fehlt (kein Copilot) → User-Prompt zum manuellen Einfügen
- Kein O365-ID → User kann manuell weitermachen ohne Auto-Import
## Bekannte Einschränkungen
- Nur Meetings, bei denen `AZURE_USER_EMAIL` der Organizer ist (Graph-Restriktion)
- Recap-Qualität abhängig von Copilot — keine Kontrolle über Inhalte
- Konfidenz-Heuristik bei mehrdeutigen Topics → User-Bestätigung nötig
- Speaker-Mapping nur bei korrekt gepflegten Personen-Notizen mit Email/Name
## Siehe auch
- [[docs/superpowers/specs/2026-05-06-meeting-end-auto-import-design]] — Design Spec
- [[docs/superpowers/plans/2026-05-06-meeting-end-auto-import]] — Implementation Plan
- [[Obsidian O365 Kalender Integration]] — Basis-Integration (Kalender-Lookup)
- [[Jour Fixe System]] — Lifecycle der Agenda-Topics