Click Create site on the license row and confirm the location configuration modal opens in place, without navigating away. Making a site from a license took an unnecessary detour: the button dropped businesses on another web page where they had to seek out the identical license again earlier than they could do anything with it. This brings the record to the brand new dashboard so companies get the same information there, and offers the later work on this series one thing to build on. Expand Plugins and affirm its sub-gadgets, including the external “Browse plugins” hyperlink, still work – that hyperlink shares the helper the eliminated merchandise used. Open the Sites checklist and a site’s Overview, Backups, Scan, and Logs Activity pages – the whole lot should work exactly as earlier than, at the identical URLs. The agency site routes (sites checklist, site overview, backups, scan, exercise log) move out of the company pages format into their very own route group. A new agencySites entry within the app config controls whether or not the group registers. Registering the company site routes as their very own group keeps them independent from the agency pages, matching how the opposite route teams register. The guard that blocks client customers and checks group-member capabilities is shared by the agency pages and the brand new group, so behavior is unchanged.

As a workforce member with out the “manage websites” permission, opening /websites ought to redirect to the company overview. Bridge the five name websites that nonetheless read camelCase purchases out of Redux by passing purchase.rawPurchase: site-stage-actions, renew-button, use-buy-actions, electronic mail-plan, and resolve-domain-status. The five remaining callers still get their purchases from the camelCase Redux selectors, so that they hand over purchase.rawPurchase – the identical one-line bridge used for the cancel-type callers in earlier slices. The Array.isArray guard was eliminated slightly than kept as a result of the parameter is now typed and each remaining callers cross an array unconditionally; a default parameter covers the undefined case that CancelPurchaseForm was already defending in opposition to with linkedPurchases ? The renewal handlers have been the last shared helper standing between three already-transformed callers and their raw information, so converting them deletes three createPurchaseObject calls as a substitute of relocating them. Source isMarketplaceHoldingSitePurchase from calypso/dashboard/utils/buy (the raw model) for the siteless renewal URL; the camelCase import stays for the other customers in that file. The repository-wide yarn typecheck-apps command remains blocked by unrelated present errors in different apps and generated package deal declarations; no error implicated a surviving file modified by this PR. 725 KB (raw) knowledge file gets duplicated into each the principle entry and the widget’s async chunk.

The dev-host allowlist entry fixes the actual failure discovered whereas testing: on my.a4a.localhost (the A4A dashboard dev host, per config/dashboard-development.json and app-a4a/routing.ts), canAccessWpcomApis() returned false as a result of the host was lacking from localDevHosts. Rename the page and the dashboard sidebar entry to “AI and MCP” (the basic sidebar already used that label). The other tabs filtered an already-fetched web page of notes locally, so they may show an incomplete set (a matching word further back in historical past merely wasn’t loaded) and had no real pagination of their very own. Final slice of the Overview revamp (A4A-2840): both dashboards now render the identical overview from one set of shared parts, so future changes land in each at once. Aligning the two provides users one consistent mental mannequin for MCP access and makes room for the Read/Write break up as write instruments land. Confirm you land on the Needs setup web page and see the purchase confirmation banner. Drop the migration incentive-ended banner – the incentive-program-ended messaging is not related, so the banner is removed.

Rather than a single giant rewrite, this migration proceeds page-by-web page so every slice stays reviewable; remove-purchase is next in that queue after handle-purchase and confirm-cancel-area. The standalone shadow override is scoped under the massive breakpoint so the present box-shadow: none reset there nonetheless wins. Pane shadow and the standalone widget body get a deeper shadow (50% black) and a grey-400 border in dark. The redesigned notifications panel hardcodes a handful of mild-mode shade literals with no dark counterpart. Those load solely by way of the legacy src/panel and src/standalone entries, not the redesigned app. The prior PRs in this stack moved the migrations-commission UI, data, and logic into shopper/dashboard/agency/earn/migrations/ and cleaned it to MSD design-system standards, with the classic A4A app consuming it by injected host considerations. When the chunk request is blocked, the dynamic import() rejects; Suspense handles the pending state however rethrows the rejection; with no boundary above it, the error reaches the React root and unmounts your entire app. Under React 19, a .render() into a root created that a lot earlier never commits, so the dialog component is rarely added to the DOM.