Add a full-daemon E2E that configures a CalDAV account over the real
Accounts API and drives Calendar/Sync with NO injected backend, so the
daemon builds a real CalDavClient against a WireMock CalDAV server and
persists the fetched events, immediately visible via ListEvents. Also
asserts the honest error for an unconfigured account and that Calendar
stays behind its BearerAuthInterceptor. Fully offline: WireMock + mock
keyring, no live network.
Refs #254#178
account add gains --protocol (imap-smtp/jmap/caldav) and --collection-url;
a caldav account is rejected before dialing the daemon if the collection
URL is missing, and prompts for a password like a mail account. account
list renders CalDAV accounts with their collection URL.
Refs #254#178
Calendar/Sync with no injected backend now resolves configured CalDAV
accounts (filtered by protocol, honoring a targeted account_id), reads
each credential from the keyring vault, builds a real CalDavClient from
the persisted collection_url, and syncs events via
calendar_sync::sync_caldav_account. The honest error now fires only when
no CalDAV account is configured. AddAccount validates CalDAV accounts
(http(s) collection_url + password) via the protocol-aware core
validation. The mail sync/outbox paths skip DAV accounts, which have no
mail backend. The CalendarEngineOverrides seam is retained for tests.
Refs #254#178
Add a nullable collection_url column to the accounts table via an
ensure_accounts_dav_columns migration that mirrors the SMTP/TLS-mode
column backfills, and round-trip it through save_account/list_accounts/
get_account. Salvage preserves collection_url alongside the TLS modes.
Refs #254#178
Add AccountProtocol::CalDav and AccountConfig.collection_url, plus an
is_dav() helper. Validation is now protocol-aware: a DAV account requires
a non-empty http(s) collection_url and skips the IMAP/SMTP endpoint
checks, while mail accounts are unchanged.
Refs #254#178
Add ACCOUNT_PROTOCOL_CALDAV = 3 and a generic AccountConfig.collection_url
(field 14) so a CalDAV account can be a first-class account entry. The
field is deliberately generic (DAV collection URL) for CardDAV reuse.
Regenerated the committed descriptor golden; additive within nuncio.v1.
Refs #254#178