From a401f4fb55f3bdf6a3609e69ba04c6ebf0968fe9 Mon Sep 17 00:00:00 2001 From: beo3000 Date: Wed, 6 May 2026 22:05:48 +0200 Subject: [PATCH] docs(it-management): document meeting auto-import via graph --- .../Meeting Auto-Import via MS Graph.md | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 03 Bereiche/IT-Management/Meeting Auto-Import via MS Graph.md diff --git a/03 Bereiche/IT-Management/Meeting Auto-Import via MS Graph.md b/03 Bereiche/IT-Management/Meeting Auto-Import via MS Graph.md new file mode 100644 index 0000000..265bfe1 --- /dev/null +++ b/03 Bereiche/IT-Management/Meeting Auto-Import via MS Graph.md @@ -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 --out `) +- `lib/graph-meetings.js` — Graph-Helper für OnlineMeetings/Transcripts/aiInsights/Recordings +- `lib/vtt-parser.js` — VTT-Parser mit ``-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: ` (verbindet Agenda fest mit Outlook-Serie) +- Meeting-Notiz: `recording_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 ` | + +## 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 + ├─> 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