Add IToastService interface to SDK (v1.35.0)
Details
Introduce ToastType enum and IToastService interface for global
in-app toast notifications. Plugins will access this via
IPluginHost.Toast to show transient messages with type-based
styling and optional action buttons. Added Toast property to
IPluginHost interface. Bumped SDK version from 1.34.0 to 1.35.0.
Redesign account setup with 3-phase flow (v1.4.0)
Details
Replace the single-screen account setup overlay with a cleaner 3-phase
flow: provider selection, OAuth in-progress, and manual setup.
OAuth providers (Google/Microsoft) now work as one-click buttons that
open the browser, complete authorization, extract the email and name
from the id_token, auto-populate all IMAP/SMTP presets, and create the
account without any manual fields. No email input required before OAuth,
no Save button needed after.
Non-OAuth providers (Yahoo, iCloud, Fastmail, Custom) go through a
dedicated manual setup screen with email/password fields, provider
dropdown, and advanced IMAP/SMTP settings.
Key changes:
- Add AccountSetupMode enum (ProviderSelection, OAuthInProgress, ManualSetup)
- Add id_token JWT payload parsing to EmailOAuthService to extract email/name claims
- Rewrite AccountSetupViewModel with setup mode state machine
- SignInWithOAuthCommand now takes provider as parameter and auto-creates account
- Remove old provider dropdown from initial screen
- Redesign AccountSetupOverlay.axaml with 3 visibility-toggled panels
- Add BackToProviderSelection navigation for both OAuth cancel and manual back
- Manual flow Providers list narrowed to non-OAuth providers only
Add RequestVaultUnlockAsync for plugin vault unlock (v1.34.0)
Details
Add IPrivStackSdk.RequestVaultUnlockAsync(vaultId) so any plugin can
request the host to prompt the user for their master password and
unlock a vault. This replaces the pattern of plugins hardcoding their
own password input UI for vault unlock.
SdkHost implements the method using a delegate callback wired in
ServiceRegistration. The callback dispatches to the UI thread and
shows the existing PasswordConfirmationWindow dialog. If the user
enters the correct password, the vault is initialized (if needed)
and unlocked. Returns true on success, false on cancel or bad password.
Also adds email-credentials and calendar-credentials to the
StandardVaultIds array so they auto-unlock at startup alongside
the connections vault.
SDK version bumped to 1.34.0. Desktop version bumped to 1.32.0.
Refactor GraphDataService and BacklinkService to hybrid provider model (v1.31.0)
Details
GraphDataService now discovers IGraphDataProvider implementations via
IPluginRegistry and aggregates their node, edge, content, and explicit
link contributions. Entity types not covered by any provider fall back
to the existing legacy SDK-based loading path, ensuring zero regressions
while plugins are gradually migrated.
BacklinkService follows the same hybrid pattern: provider contributions
are merged with legacy entity loading, and wiki-link parsing is
consolidated through the shared WikiLinkParser utility.
PluginRegistry auto-registers IGraphDataProvider alongside the existing
ILinkableItemProvider in ActivatePlugin(). GraphPlugin injects
IPluginRegistry into GraphDataService via DI.
All 16 entity types continue to appear in the graph via the legacy
fallback until external plugins implement IGraphDataProvider.
Add IGraphDataProvider capability interface and WikiLinkParser utility (v1.33.0)
Details
Introduces the IGraphDataProvider capability interface in PrivStack.Sdk that
allows plugins to contribute their own graph nodes, structural edges, content
fields for wiki-link parsing, and explicit cross-entity links. This decouples
the Graph plugin and BacklinkService from hard-coded knowledge of every entity
type — each plugin can now self-describe its graph contributions.
New SDK types: GraphContribution, GraphNodeContribution, GraphEdgeContribution,
ContentField, ExplicitLinkContribution, and ParsedLink.
WikiLinkParser consolidates the duplicated wiki-link regex patterns and content
extraction logic previously found in both GraphDataService and BacklinkService
into a single shared utility with ParseLinks(), ExtractContentFromEntity(), and
ExtractSnippet() methods.
Get notified about new releases