The options screen gets three checkboxes (letters, numbers, specials), saved as
charSets in chrome.storage.sync next to passwordSize. A missing key means all
three are in, which is how the extension behaved before.
The API only takes format and length, so the selection is applied on the client:
characters outside the checked classes are dropped from the server stream.
Filtering a uniform stream keeps it uniform over the subset, unlike a modulo
remap, which would bias it. Each request now asks for several passwords' worth of
characters, since fewer of them survive the filter, and the pool is walked in
blocks until one covers every checked class, so a password always contains each
of them. After three requests it ships the last block anyway instead of looping.
Entropy and the alphabet size on both screens follow the selection instead of the
fixed 70, and the last checked box is disabled so the selection cannot go empty.