Fix cloud sync pushing local_only entities (CalDAV/ICS events)
Details
Events from external sources (CalDAV subscriptions, ICS feeds) are
marked local_only in the database and should never be synced to cloud
or P2P — the remote server is the source of truth.
Two defense-in-depth guards added:
1. SdkHost.NotifySyncIfMutation: Skip sync notification entirely when
the SDK request carries the local_only parameter. This prevents
the outbound pipeline from ever seeing local_only mutations.
2. SyncOutboundService.NotifyEntityChanged: Parse the entity payload
JSON and reject entities where local_only is true. Catches any
edge case where a local_only entity reaches the outbound path
without the parameter (e.g. ViewModel-initiated edits).
Refactor Tasks split layout to use SplitPaneLayout control
Details
Replace ~95 lines of inline resize code (fields, 4 handlers,
ApplyDetailPanelRatio, FindControl lookups) with the shared
SplitPaneLayout control from UI.Adaptive. The code-behind now
has a single OnDetailPanelRatioChanged event handler for
persistence.
Also adds IsFinite guard in SetDetailPanelRatio to prevent
JSON serialization crash when ratio computes to Infinity.
Make API docs dialog dynamically populate endpoints from plugins
Details
Replace hardcoded Tasks/Projects endpoint sections with an ItemsControl
that discovers all IApiProvider plugins at runtime via IPluginRegistry.
Each plugin gets a collapsible Expander showing its routes with color-coded
HTTP methods (GET=green, POST=primary, PATCH=warning, DELETE=danger).
- LoadRoutes() resolves plugin display names from metadata
- MethodBrush resolved from theme resources at load time
- Empty state shown when no plugins register API endpoints
- Shell endpoints (status, routes) remain static
Add API documentation dialog and View Documentation link
Details
New ApiDocsWindow dialog accessible from Settings > Developer via
"View Documentation" link. Shows a comprehensive guide with:
- Overview of the local API and its purpose
- Authentication instructions (X-API-Key and Bearer token)
- Step-by-step getting started guide with curl examples
- Full endpoint listing (shell, tasks, projects) with color-coded
HTTP methods (GET/POST/PATCH/DELETE)
- Create and search task examples with complete curl commands
- Security note about localhost-only binding and key management
Fix task list items not respecting pane width
Details
The split grid uses a * column for the left pane, but the grid's
own Bounds.Width gets inflated by content desired size, preventing
the left pane from shrinking properly. Fixed by reading available
width from the parent Panel (which truly fills available space)
instead of from the grid itself. Both ApplyDetailPanelRatio and
drag resize now use parent width for calculations.
Also added left margin on the left pane so items don't touch the
edge.
Get notified about new releases