Skip to content

PvZ shared model picker

PvZ now opens the current chat ModelBrowser instead of the older sandbox modal. The game companion keeps a same-account iframe mounted in one transparent full-screen dialog, so the shared picker owns the visible surface, backdrop and close button. Closing and reopening does not reload the app. The game pauses while the picker is open.

Model selection still validates account identity and the active profile, persists the account-bound selection, checks the saved selection and waits for the game acknowledgement. Official, private and local model sources keep the existing handoff. A source change uses the embedded account validation callback. Selecting a game model leaves the world's mix setting alone. Opening this embedded picker hydrates saved config without uploading missing local defaults. Older game pages can still use the collapsed trigger.

Escape in the sorting/source dropdown is consumed before the outer picker handler; another Escape closes the picker. Pending selection ignores additional model clicks. Private API setup opens account settings in another tab instead of replacing the embedded game surface.

Validation:

  • 21 focused tests cover the current picker, private/standalone account selection and the PvZ adapter, including zero config writes on open, preserved mix settings and pending selection.
  • Compiled game and app in a headless browser, English desktop 1440×900 and Chinese touch 844×390: one visible picker, no outer frame, same iframe on reopen, one account-bound model save, game paused while open. Account/provider HTTP responses were fixtures; no paid AI requests.
  • The same compiled game checks confirm an unpaused greeting, a paused question and one native Dave voice cue per new line. Game-side upgrade, speech and model lifecycle regression coverage is recorded separately.
  • Hosted build and monorepo typecheck pass. No schema changes.

This is not a physical-device result or a certification of generated provider wording. Production publication is recorded in the game release receipt.