- Sign key dropdown was empty when switching from openpgpjs to CLI because
RefreshLibrary never repopulated it with native GPG keys; now calls
RefreshListSign on library switch and resets the "sign" sentinel to "0".
- Library dropdown did not persist the selection on change, causing pgpLibrary
to revert to "openpgpjs" on reload and triggering the PassphraseModal
unexpectedly during CLI decryption; fixed by calling saveSettings() in
the dropdown onChange handler.
- Sign key dropdown appeared twice when RefreshListSign was called concurrently
(e.g. from display() and RefreshLibrary); fixed with a generation counter
that discards stale async results before addDropdown() is called.
- Encrypt with openpgpjs + signing enabled threw "signing key is not decrypted"
when the passphrase field was left blank; EncryptText() now resolves the
passphrase from cache/settings or prompts via PassphraseModal before calling
gpgEncrypt(), and caches it after a successful sign+encrypt.