The "price raised" (case 3) handler did `set(item.offerId, item)` then an
unconditional `delete(requestedOfferId)`. When the re-priced offer kept the same
id (offerId === requestedOfferId), the set was immediately undone and the offer
disappeared from the list though it was still buyable. Delete the old key first,
then set under the new id.
redeemSoldOffers optimistically removed the sold offers but never reset
creditsWaiting, so the redeem panel (gated on creditsWaiting > 0) kept rendering
"get 0 sold items for N credits" with an active Redeem button until the server
re-pushed the offers. Reset creditsWaiting to 0 on redeem.
install.mjs hardcoded the renderer SDK location as ../Nitro_Render_V3, so re-running it next to a renderer checkout under a different name silently cloned a second copy.
Resolve the renderer dir by priority: --renderer-dir=<path> flag, NITRO_RENDERER_DIR env, interactive prompt, then auto-detect an existing sibling among Nitro_Render_V3 / renderer. A fresh clone with no flag/env still defaults to ../Nitro_Render_V3, and existing checkouts are auto-detected (no more duplicate clones). Adds --renderer-repo=<url> for the clone URL; --help, the step labels and the summary reflect the resolved dir.
Backward-compatible, pure installer change — no client/runtime code touched.
Remove a trailing comma after the closing object in public/configuration/ui-config.example. This fixes invalid JSON syntax that could cause parsing errors when loading the UI configuration.
Wire both classic and modern catalog purchase widgets to the shared catalogSkipPurchaseConfirmation setting used by User Settings. When enabled, the primary buy/rent button now calls the purchase flow directly instead of first switching to the CONFIRM state. Existing validation, gift purchases, club checks, limited sold-out handling, and Builders Club placement flows remain unchanged.