f563dd17dd
- EspoCrmClient: typed REST wrapper with Polly v8 pipeline
(Timeout 15s -> Retry 3 exp+jitter -> CircuitBreaker 0.5/5/30s).
Auth via Espo-Authorization header (base64 username:apiKey).
Treats 409 on /MailRouter/file as success (already-filed dedup),
401/403 raise EspoCrmAuthorizationException for re-auth UI.
- DTOs in Models/ matching MailRouter v1.2.0 contract from
PROJECT-BRIEFING.md (FileEmailRequest now includes replyTo + isHtml,
attachments use contentType+contentBase64).
- DpapiCredentialStore (Security/): ProtectedData.Protect with
CurrentUser scope, SHA256("MarcusLaw.OutlookAddin.v1") entropy.
- SettingsManager + AppSettings + WatchedFolder (Configuration/):
System.Text.Json with UnsafeRelaxedJsonEscaping for Hebrew strings,
UTF-8 without BOM, recovers to defaults on missing/corrupt file.
- LoggerFactory (Logging/): Serilog daily-rolling File sink with
14-day retention.
24 xUnit tests covering happy/4xx/5xx/auth/Hebrew round-trips all pass.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>