docs(plans): Outlook via Power Automate enterprise bypass plan#954
Conversation
Adds a plan for integrating with Outlook on IT-managed machines where Azure AD app registration is blocked, using Power Automate HTTP triggers as a relay to the built-in Outlook connector. Introduces a generic `webhook` connector type for the connectors framework and Power Automate flow templates for inbox, email read, send, and calendar operations. Reviewed by architecture-reviewer and code-reviewer agents; 14 findings incorporated (see Appendix A).
SummaryDocumentation-only PR adding a 853-line draft plan for an Outlook integration via Power Automate HTTP triggers — a workaround for IT-managed machines where Azure AD app registration is blocked. The plan is unusually thorough: it accurately references the existing connectors framework ( Issues Found🟢 Minor:
|
## Why this matters Ships the v0.17.6 patch: a new Email Triage Agent with Gmail (every email body stays on local Lemonade), the OAuth PKCE foundation that backs it, settings UI card layout, and a sweep of installer fixes that close the remaining first-launch failures uncovered after v0.17.5. Custom Python agents that follow the template's `super().__init__(**kwargs)` pattern no longer crash on the first message in the Agent UI. Full notes: `docs/releases/v0.17.6.mdx`. ## What's New - **Email Triage Agent with Gmail** ([amd#965](amd#965)) — `EmailTriageAgent` with 25 tools across read / organize / reply / delete / calendar mixins. Every email body processed locally on Lemonade; seven destructive tools confirmation-gated; three layers of prompt-injection defense; SQLite undo log via `DatabaseMixin`. - **OAuth PKCE foundation for Google connections** ([amd#926](amd#926)) — Self-contained `gaia.connections` module: refresh tokens in the OS keychain (Keychain / DPAPI / SecretService), per-agent grants in `~/.gaia/connections/grants.json`, async token cache with refresh rotation. Baseline for the v0.17.7 connectors framework. - **Settings UI card layout** ([amd#969](amd#969)) — Outlined cards with accent left-stripe replace margin-separated blocks across all settings sections; light + dark themes both updated. ## Bug Fixes - **Custom Python agents crashed on first message** ([amd#974](amd#974), closes [amd#973](amd#973)) — `python_factory` now introspects the target class's `__init__` chain and only forwards kwargs the chain accepts, so the bare `super().__init__(**kwargs)` template pattern no longer crashes with `unexpected keyword argument 'rag_documents'`. - **Windows installer failed at `ensure-uv`** ([amd#968](amd#968), closes [amd#966](amd#966)) — `uv` binary now bundled for `win-x64`; packaged Windows rescue installer included. - **macOS installer failed at `ensure-uv` on clean Apple Silicon** ([amd#967](amd#967), closes [amd#941](amd#941)) — Pinned `uv` v0.5.14 (`aarch64-apple-darwin`) shipped in the DMG; new `dmg-structural-smoke` CI job blocks future drift. - **AppImage users hit `gaia: command not found`** ([amd#942](amd#942), closes [amd#782](amd#782)) — Startup writes a `~/.local/bin/gaia` shim so `gaia` is on PATH after first launch (skips creation if already present). - **Windows fell back to Qwen instead of Gemma 4 default** ([amd#949](amd#949), closes [amd#948](amd#948)) — Model-resolution logic fixed so Gemma loads correctly on Windows. ## Tooling & Docs - **`gaia-release` skill** ([amd#939](amd#939)) — Phased release flow with hard gates before every irreversible step; encodes the manual pre-tag verification that caught two release-blocking bugs in v0.17.4. - **Internal-task issue template** ([amd#906](amd#906)) — Third issue template for agent-assignable internal work. - **Outlook via Power Automate plan** ([amd#954](amd#954)) — Enterprise-bypass spec for v0.17.7 Outlook integration. - **PR description guidance sharpened** ([amd#947](amd#947)) — `CLAUDE.md` "tight and value-focused" rule with anti-patterns. - **Stale `macOS uv fetch removed` orphan comment removed** ([amd#975](amd#975)). ## Thanks External contributors in this release: - [@theonlychant](https://github.com/theonlychant) — installer fixes ([amd#968](amd#968), [amd#942](amd#942), [amd#949](amd#949)) - [@BlueriteSoul](https://github.com/BlueriteSoul) — reported AppImage `gaia: command not found` ([amd#782](amd#782)) - [@nuts23](https://github.com/nuts23) — reported Windows Gemma/Qwen fallback ([amd#948](amd#948)) ## Release checklist - [x] `util/validate_release_notes.py docs/releases/v0.17.6.mdx --tag v0.17.6` passes - [x] `src/gaia/version.py` → `0.17.6` - [x] `src/gaia/apps/webui/package.json` → `0.17.6` - [x] Navbar label in `docs/docs.json` → `v0.17.6 · Lemonade 10.2.0` - [x] All 14 commits in the range (v0.17.5..HEAD) are represented in the notes - [ ] Review from @kovtcharov-amd addressed
On IT-managed machines, Azure AD app registration is blocked — making the existing
mcp-outlookconnector (which requiresMS_CLIENT_ID/MS_CLIENT_SECRET) and the planned native MS Graph OAuth connector unusable. This plan introduces Power Automate HTTP triggers as a relay: the user imports 4 flow templates into their already-IT-approved Power Automate license, pastes the trigger URLs into GAIA Settings, and Outlook email + calendar works without any Azure AD app registration.Before: no viable Outlook integration path on corporate machines. After:
"check my email"works via Power Automate in ~10 minutes of setup.Key decisions:
webhookconnector type in the connectors framework — generic (works for Zapier/Make/n8n too), not Power Automate-specificConnectorSpecfields — webhook endpoints derived fromconfig_schema, following the framework's "type-driven, not connector-driven" principleemail.read,email.send,calendar.read) so the existing grants system works without special-casingReviewed by architecture-reviewer and code-reviewer agents; 14 findings incorporated (Appendix A in the plan).
Test plan
docs/plans/power-automate-outlook.md— verify architectural consistency with connectors framework plan (docs/plans/connectors.mdx)EmailSourceinterfaceemail-calendar-integration.mdxoremail-triage-agent.mdx(priority ordering for Outlook is intentionally different — §6 explains why)