diff --git a/CHANGELOG.md b/CHANGELOG.md index 3114f2b..b40eb45 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -153,6 +153,34 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). can bind without admin); the diagnostic warning fires the exact command string in the log if the bind fails. +#### "I only see TeamsISO" — Phase E.1+E.2 quality-of-life +For operators who want to launch TeamsISO and never look at the Teams UI: +- **Launch Microsoft Teams on TeamsISO startup** preference (DISPLAY tab). + Auto-fires Teams in the background each time TeamsISO starts; the Teams + window appears briefly during boot then can be hidden automatically. +- **Auto-hide Teams windows when launched** preference (DISPLAY tab). + `TeamsLauncher.AutoHideAfterLaunchAsync` polls for 15s after launch + hiding splash, main window, and follow-up panels as they materialize. + Works on top of the existing eye-toggle for manual restore. +- **Quick-join Teams meeting from URL** — small input + Join button in the + IN-CALL bar. Paste a `https://teams.microsoft.com/l/meetup-join/...` + or `msteams:/l/meetup-join/...` link, click Join, Teams launches into + the meeting in one shot. Eliminates the open-Teams → Calendar → find → + click Join dance. Pairs with auto-hide so the operator goes straight + from "I have a meeting link" to "I'm in the meeting, driving routing". +- **Teams meeting state pill** in the IN-CALL bar — shows `IN CALL · ` + / `READY` / empty. UIA-driven probe of Teams' Leave button at 1Hz; the + meeting title comes from Teams' window title with the brand suffix + stripped. So an operator with auto-hide on knows whether they're in a + meeting AND which one without restoring the Teams window. 10 new unit + tests on `MainViewModel.ExtractMeetingTitle`. +- **Rail Launch Teams click semantics** — was ambushing operators with a + "Close all Teams windows now?" dialog whenever Teams was running (e.g. + when hidden via the eye-toggle). Now click = launch / surface / restore; + right-click = stop. `TeamsLauncher.TryLaunch` now collects per-attempt + errors (no more silent fall-through) and adds the AppX-activation + fallback for hosts where the `ms-teams:` URI handler is misconfigured. + #### UI polish — visible affordances on the dark canvas - Hover state on every themed button (Ghost / Caption / RailIcon / IsoToggle) was barely distinguishable from the resting state. Bumped `Wd.SurfaceHover` @@ -174,6 +202,15 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - ContextMenu / MenuItem restyled: dark card with rounded corners + cyan- tinted hover. Affects the right-click menu on participant rows (Toggle ISO / Restart this ISO / Open preview / Record / Copy NDI source name). +- CheckBox content no longer clips at the 380px settings panel: template's + StackPanel replaced with a Grid (Auto + *) and a TextWrapping=Wrap + resource injected into the ContentPresenter so long labels flow onto + multiple lines. +- Manual X dismiss on toast notifications for live-show situations where + the operator wants to clear visual clutter without waiting 3s. +- Footer's control-surface badge surfaces the full LAN URL (not just port) + when LAN-reachable mode is on, so a thin client can be configured by + reading the URL straight off the host's footer. #### Control surface - REST API on `127.0.0.1:9755` with endpoints for participant ISO toggle (by diff --git a/docs/superpowers/plans/_NEXT.md b/docs/superpowers/plans/_NEXT.md index 0011861..aa73c29 100644 --- a/docs/superpowers/plans/_NEXT.md +++ b/docs/superpowers/plans/_NEXT.md @@ -120,6 +120,20 @@ Spec at `docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md`. All requires a one-shot `netsh http add urlacl`; the diagnostic warning fires the exact remediation command if the bind fails. +### "I only see TeamsISO" — Phase E.1+E.2 follow-ups +- **Launch + auto-hide Teams** preferences in DISPLAY tab. Teams runs in the + background; window appears briefly then hides automatically; operator + drives everything from the IN-CALL bar + participants DataGrid. +- **Quick-join from URL** in the IN-CALL bar. Paste a Teams meeting link, + click Join, Teams launches into the meeting. Eliminates the open-Teams + → Calendar → find → click join dance. +- **Teams meeting state pill** — `IN CALL · ` / `READY` / + empty. UIA probe at 1Hz for the Leave button; meeting title from + Teams' window title with the brand suffix stripped. +- **Launch Teams click semantics** — left-click = launch / surface / restore; + right-click = stop. Was previously ambushing operators with a stop-Teams + dialog when Teams was hidden via the eye-toggle. + ### UI polish - Visible hover affordances on every themed button (Ghost / Caption / RailIcon / IsoToggle / Primary). Cyan accent borders + brighter fills @@ -142,6 +156,6 @@ Spec at `docs/superpowers/specs/2026-05-08-embedded-teams-orchestration.md`. All 2. **Acquire a code-signing cert.** Pipeline is wired (see "CI / Release / Docs" above); just needs `SIGN_CERT_PFX_BASE64` + `SIGN_CERT_PASSWORD` set in Forgejo Secrets. OV cert (~$200/yr) gets us signed but SmartScreen builds reputation slowly; EV cert (~$300/yr, hardware token) is SmartScreen-trusted immediately. Azure Trusted Signing is the cloud-native path if a token-on-runner is fiddly. -3. **Activate `MediaFoundationRecorderSink`.** Scaffold + activation docs at `docs/REAL-TIME-RECORDING.md` ship in this batch (gated behind `MF_AVAILABLE` build symbol). To enable: `dotnet add Vortice.MediaFoundation`, define `MF_AVAILABLE`, swap one line in `IsoController.EnableIsoAsync`. Rough ~10× disk-pressure reduction. +3. **Port MediaFoundationRecorderSink to Vortice 3.6.2 API.** NuGet package added but the May 9 scaffold targeted an older Vortice API. Port pass needed before `MF_AVAILABLE` can be defined; see `docs/REAL-TIME-RECORDING.md` "Status — May 2026" section for the specific API gaps (MFVersion / MF_LOW_LATENCY / IMFMediaType setters / IMFMediaBuffer.Lock signature / IMFSinkWriter.Finalize_ rename). Once ported, gives ~10× recording disk-pressure reduction. 4. **Forward Teams keyboard shortcuts via SendInput.** Phase E.2 hides the Teams window but doesn't forward Ctrl+Shift+M / Ctrl+Shift+O / Ctrl+Shift+H to it. UIA covers mute/camera/share/leave/raise-hand/chat/background already; SendInput would let us pass arbitrary global hotkeys through to a hidden Teams for actions UIA can't reach. Lower priority now that UIA covers the core actions.