github LanternOps/breeze v0.96.0

latest releases: v0.115.0, v0.114.0, v0.113.0...
2 months ago

Breeze RMM v0.96.0 — distributor ordering, the M365 control-plane foundation, and a hardened backup pipeline.

Summary

  • Distribution — a live TD SYNNEX distributor lookup and a new PAX8 safe-ordering / billing-truth workflow bring purchasing into Breeze (#2559, #2501).
  • Microsoft 365 — the control-plane foundation lands, plus an opt-in customer Graph-read consent flow (both dark by default) (#2495, #2511).
  • Backups — a broad reliability pass: Windows system-image (system state) works end-to-end, integrity/test-restore now actually detects corruption, restores preserve file mode + mtime, and per-device "Run backup now" arrives (#2581, #2564, #2554, #2556, #2558).
  • Quotes — cloning, a polished editor/PDF/email pipeline, customer bill-to, and per-table subtotals (#2535, #2549, #2584).
  • Extensions — a versioned runtime extension contract for building on Breeze (#2548).

Added

  • PAX8 safe ordering + billing-truth workflow — order through PAX8 from Breeze with quantity-evidence snapshots and an authorized baseline so billed quantities stay reconciled against what was actually ordered (#2501).
  • Live TD SYNNEX distributor lookup — a new lookup_distributor_product MCP/AI tool queries real-time distributor pricing and availability (#2559).
  • M365 control-plane foundation — canonical Microsoft 365 connection metadata (profiles, auth modes, credential domains, permission-manifest versioning) that existing direct connections migrate into transparently as legacy-direct (#2495).
  • M365 customer Graph-read consent — an opt-in, per-organization consent flow for read-only customer Graph access. Dark by default; enabled per rollout (#2511).
  • Quote cloning — duplicate an existing quote, optionally selecting the target company/contact and reassigning a draft's company (#2535, #2584).
  • Versioned runtime extension contract — a stable, versioned contract for runtime extensions built against Breeze (#2548).
  • Per-device "Run backup now" — trigger an on-demand backup from a device's Backup tab, with a timezone-correct next-run display (#2558).

Improved

  • Quotes editor/PDF/email — editor and generated-PDF polish, customer bill-to details, per-table subtotals, and tidier header actions (#2549).
  • Enrollment keys — the create form now includes a Site selector so keys enroll devices into the right site (#2557).
  • "Run all backups" — resolves each device's own backup profile instead of a single shared config (#2555).

Fixed

  • Windows system-image (system state) backup was broken end-to-end; it now completes and restores correctly (#2581).
  • Backup integrity & test-restore now genuinely detect corruption instead of checking presence only; restores preserve file mode + mtime, and the breeze-backup helper is installed alongside the agent (#2564).
  • Backup / verify / restore now actually execute on real agents — config is delivered to the verify/restore paths, agent results are recorded, and failed backups surface in the UI (#2554, #2556).
  • Windows helper lifecycle durability — fixes helper-process accumulation under RDS/multi-session hosts (#2520).
  • Security & Compliance Posture report produced incorrect figures; corrected (#2518).
  • Update Rings tab SSR hydration mismatch — the scope-gated tab now defers to post-mount (#2583).
  • macOS installer keeps the bootstrap token in the bundle filename, fixing an App Translocation enrollment regression (#2545).
  • Dev Docker image now copies the extension SDK into the dev API image (#2582).

Security

Self-Hosting / Upgrade Notes

1. Upgrade command. Bump BREEZE_VERSION=0.96.0 in /opt/breeze/.env, then:

docker compose pull api web && docker compose up -d

(If you build from source, run pnpm install first.)

2. Database — 6 idempotent migrations, auto-applied on boot via autoMigrate (unless AUTO_MIGRATE=false). They add the pax8_* and M365 consent tables and reshape m365_connections into the new control-plane model. No large-table rewrites or backfillsm365_connections and the new pax8_* tables are small, so this is a fast upgrade. Existing direct M365 connections are backfilled to legacy-direct in place and keep working. Every new NOT NULL column ships with a DEFAULT, so a previously-deployed API can still write during the rollout window.

3. New required environment variables — none for standard deployments. Several new M365_CUSTOMER_GRAPH_READ_* / M365_GRAPH_READ_EXECUTOR_* variables exist, but they are only required when you enable the customer Graph-read rollout (M365_CUSTOMER_GRAPH_READ_ONBOARDING_ENABLED=true). Left at its default (false), boot requires nothing new and existing M365 flows are untouched. If you do enable it, the config validator fails closed until those keys are set — and remember to map any new keys in the api service environment: block of your compose, not just .env.

4. Behavior changes & feature flags.

  • M365_CUSTOMER_GRAPH_READ_ONBOARDING_ENABLEDdefault false (dark). Customer Graph-read consent initiation is off unless you turn it on, per-org.
  • No existing defaults changed; existing M365 (M365_ENABLED) and connection flows behave exactly as before.

No breaking changes.

Full Changelog: v0.95.1...v0.96.0


What's Changed

  • docs(skill): capture v0.95.0 migration traps in the release skill by @ToddHebebrand in #2546
  • fix(security): force websocket-driver >=0.7.5 (GHSA-xv26-6w52-cph6) by @ToddHebebrand in #2547
  • chore: gitignore .githooks (LFS-managed hooks) by @ToddHebebrand in #2542
  • docs(readme): AI-native rebrand and em-dash sweep by @ToddHebebrand in #2540
  • docs: Breeze M365 foundation + control-plane design by @ToddHebebrand in #2541
  • chore(deps): bump softprops/action-gh-release from 3.0.1 to 3.0.2 in the github-actions group by @dependabot[bot] in #2524
  • chore(deps): bump actions/setup-node from 6 to 7 by @dependabot[bot] in #2525
  • fix(agent): make backup, verify, and restore actually execute on real agents by @ToddHebebrand in #2554
  • fix(installer): keep macOS bootstrap token in the bundle filename (App Translocation regression, #2544) by @ToddHebebrand in #2545
  • feat(quotes): add quote cloning by @ToddHebebrand in #2535
  • fix(ci): remove duplicate websocket-driver override breaking pnpm-lock by @ToddHebebrand in #2561
  • fix(backup): record agent results, deliver config to verify/restore, surface failed backups by @ToddHebebrand in #2556
  • fix(backup): resolve each device's profile in "Run all backups" by @ToddHebebrand in #2555
  • feat(web): per-device "Run backup now" + timezone-correct next-run on the device Backup tab by @ToddHebebrand in #2558
  • fix(web): add a Site selector to the enrollment key create form by @ToddHebebrand in #2557
  • feat(ai): live TD SYNNEX distributor lookup as an MCP tool (lookup_distributor_product) by @ToddHebebrand in #2559
  • fix(agent): Windows helper lifecycle durability (RDS accumulation) by @ToddHebebrand in #2520
  • feat(m365): establish Breeze control plane foundation by @ToddHebebrand in #2495
  • feat(pax8): add safe ordering and billing-truth workflow by @ToddHebebrand in #2501
  • fix(quotes): fix stale mock in cloneQuote test after pax8 select insertion by @ToddHebebrand in #2563
  • fix(ci): raise Type Check heap to avoid tsc OOM on heavy branches by @ToddHebebrand in #2565
  • feat(quotes): editor/PDF/email polish + customer bill-to + per-table subtotals by @ToddHebebrand in #2549
  • fix(reports): correct the Security & Compliance Posture report by @ToddHebebrand in #2518
  • feat(extensions): add versioned runtime extension contract by @ToddHebebrand in #2548
  • feat(m365): add customer Graph Read consent by @ToddHebebrand in #2511
  • ci(agent): gate Go vet + lint, race the full agent tree by @ToddHebebrand in #2512
  • fix(backup): integrity/test-restore detect corruption; restore preserves mode+mtime; install breeze-backup helper by @ToddHebebrand in #2564
  • chore(deps): bump cloud.google.com/go/storage from 1.63.0 to 1.63.1 in /agent by @dependabot[bot] in #2567
  • chore(deps): bump tauri-plugin-single-instance from 2.4.2 to 2.4.3 in /apps/viewer/src-tauri by @dependabot[bot] in #2566
  • chore(deps): bump github.com/fsnotify/fsnotify from 1.9.0 to 1.10.1 in /agent by @dependabot[bot] in #2568
  • chore(deps): bump the hono group with 2 updates by @dependabot[bot] in #2574
  • chore(deps): bump react-native-screens from 4.26.0 to 4.26.1 in the mobile group by @dependabot[bot] in #2572
  • chore(deps): bump autoprefixer from 10.5.2 to 10.5.3 in the tailwind group across 1 directory by @dependabot[bot] in #2573
  • chore(deps): bump pg from 8.21.0 to 8.22.0 by @dependabot[bot] in #2579
  • chore(deps): bump turbo from 2.9.17 to 2.10.5 by @dependabot[bot] in #2577
  • chore(deps): bump @react-navigation/bottom-tabs from 7.16.2 to 7.18.8 by @dependabot[bot] in #2578
  • chore(deps): bump react-hook-form from 7.78.0 to 7.81.0 by @dependabot[bot] in #2575
  • chore(deps): bump office-addin-dev-certs from 2.0.9 to 2.0.10 by @dependabot[bot] in #2576
  • fix(backup): Windows system_image (system state) broken end-to-end by @ToddHebebrand in #2581
  • fix(docker): copy extension-sdk into the dev API image (#2548 follow-up) by @ToddHebebrand in #2582
  • fix(web): defer scope-gated Update Rings tab to post-mount (SSR hydration mismatch) by @ToddHebebrand in #2583
  • perf(ci): shard integration tests 4 ways + run migrations once per run by @ToddHebebrand in #2585
  • feat(quotes): clone with company/title selection, draft company reassignment, tidier header actions by @ToddHebebrand in #2584
  • fix(release): API image can't resolve @breeze/extension-sdk + executor image ref must be lowercase by @ToddHebebrand in #2587

Full Changelog: v0.95.1...v0.96.0

Don't miss a new breeze release

NewReleases is sending notifications on new releases.