Migrate Email plugin OAuth to shell-level connections
Details
Delete plugin-owned OAuth infrastructure (OAuthBrowserFlow, EmailOAuthService,
OAuthProviderConfig) — OAuth is now managed at the shell level via Settings →
Connections. Update EmailCredentials to use ConnectionId referencing shell
connections instead of storing tokens directly. Update ImapSyncService and
SmtpSendService to retrieve access tokens via IConnectionService.GetAccessTokenByIdAsync
instead of EmailOAuthService.EnsureValidTokenAsync. Update AccountSetupViewModel
to query existing shell connections rather than launching its own OAuth flow —
users must connect Google/Microsoft in Settings first. Add automatic migration
in EmailPlugin.OnInitializeAsync that detects legacy OAuth accounts (with
RefreshToken but no ConnectionId) and imports them into shell connections via
IConnectionService.ImportConnectionAsync. Remove EmailOAuthService dependency
from all ViewModels. Plugin version bumped to 1.27.0.
Add GitHub Issues sync for Tasks plugin
Details
Implements bidirectional sync between GitHub issues and PrivStack tasks.
Users can add GitHub repositories as issue sources, configure per-repo
filters (assignee, labels, milestone), and choose between bidirectional
or pull-only sync modes.
New files:
- Models: GitHubIssueSource (source config), GitHubIssueModels (API DTOs)
- Services: GitHubIssueApiClient (REST API), GitHubIssueSourceService (CRUD),
GitHubIssueFieldMapper (status/priority mapping), GitHubIssueSyncService
(pull/push orchestration with last-write-wins conflict resolution)
- Controls: ModalOverlay (reusable overlay pattern for Tasks plugin)
- ViewModels: GitHubIssueSourcesViewModel (3-state overlay: source list,
repo picker, filter config)
- Views: GitHubIssueSourcesOverlay (AXAML overlay UI)
Modified files:
- TaskItem.cs: Added source_type, source_id, source_ref, source_etag fields
with IsGitHubIssue and GitHubUrl computed properties
- TasksPlugin.cs: Added github_issue_source entity schema, source tracking
indexed fields, service initialization with IConnectionService guard
- TasksViewModel.cs: Added GitHub service properties, lazy-init overlay VM,
OpenGitHubIssueSources command
- TasksView.axaml: GitHub button in toolbar, GitHub badge on synced tasks,
overlay placement
- TaskDetailPanel.axaml: GitHub Issue metadata card with issue ref and link
Version: 1.15.1 -> 1.16.0
Replace CalendarDatePicker with MiniCalendarPicker in Tasks
Details
Swaps out Avalonia's default CalendarDatePicker for the new
MiniCalendarPicker from UI.Adaptive in both TasksView (due date)
and TaskDetailPanel (due date, start date, reminder). The new
picker shows a compact mini-calendar popup matching the Calendar
plugin's sidebar style. Binds directly to DateTimeOffset? properties
instead of the DateTime? wrapper properties. Bumps to v1.15.0.
Tasks UX: auto-assign project, remove Add buttons, remove card background
Details
Project dropdown now auto-assigns on selection change via
OnSelectedProjectChanged partial handler. Added a static "None" sentinel
project as the first item so users can clear the assignment from the
dropdown directly. Removed the Assign and Clear buttons.
Removed redundant "Add" buttons from Tags, Contexts, Checklist, and
Related Tasks inputs — all already support Enter-to-submit via existing
KeyDown handlers. Updated watermark text to hint at Enter usage.
Removed the ThemeSurfaceBrush card background from the detail area so
content sits directly on the page background for a cleaner, modern look.
Version bump: 1.13.0 → 1.14.0
Add AI "Generate Title from Content" action to Notes and Tasks plugins
Details
Notes plugin (1.50.0): Adds GenerateTitleFromContentAsync() that extracts all page block text, sends it to the AI service with a title-generation prompt (25-75 chars), and presents the suggestion via inline observable properties. Accept sets CurrentPageTitle, dismiss clears the suggestion, and undo restores the previous title. A "Generate Title" menu item is added to the BlockWrapper AI context menu alongside Summarize and Rewrite.
Tasks plugin (1.13.0): Adds GenerateTitleFromContentAsync() that gathers the task description, task notes, and associated project name/description for richer context. The AI Title button is placed in both the main TasksView header (next to status/priority badges) and the TaskDetailPanel headline block. An accept/dismiss suggestion banner appears below the title. Also adds AI Generate/Rewrite buttons to the main TasksView Description section (previously only in TaskDetailPanel).
Both use the direct IAiService.CompleteAsync() pattern with MaxTokens=48, Temperature=0.5, and dedicated feature IDs for usage tracking.
Get notified about new releases