Fix AXAML xmlns references after Services extraction
Details
8 AXAML files still referenced `using:PrivStack.Desktop.Models` which
is now an empty namespace — all model types moved to
`PrivStack.Services.Models` during the architecture split.
Updated xmlns declarations:
- models → PrivStack.Services.Models (8 files)
- BacklinkEntry → PrivStack.Services via new svc: prefix (InfoPanel)
Register entity schemas with Rust core in headless plugin registry
Details
HeadlessPluginRegistry was loading and initializing plugins but never
registering their entity schemas with the Rust core via FFI. This caused
the API to return "No schema registered for entity type: task" errors
because the Rust engine didn't know about the entity types.
Mirrors the desktop PluginRegistry behavior:
- RegisterEntitySchemas() called per-plugin BEFORE InitializeAsync()
- RegisterSystemEntitySchemas() for system types (entity_metadata,
property_definition, property_group, property_template)
- Uses NativeLib alias for PrivStack.Services.Native.NativeLibrary
(InternalsVisibleTo already grants access to privstack-server)
Add HeadlessPluginBase and update plugin scanning for headless split
Details
Add HeadlessPluginBase to PrivStack.Sdk — an abstract IAppPlugin
implementation with no-op defaults for UI methods (CreateViewModel,
navigation, etc.). Headless plugin assemblies extend this to provide
services, capabilities, and API routes without Avalonia dependencies.
Update HeadlessPluginRegistry to prioritize .Headless.dll assemblies
(sorted first in scan order) so they load before their full Avalonia
counterparts. Plugin ID deduplication prevents double-loading.
Update run-server.sh to build .Headless plugin projects in a first
pass, then skip full plugins that have a headless variant.
Add run-server.sh dev launcher for headless server
Details
Points at test-data/ by default (same DB as build.sh --run --with-plugins).
Use --live for the system data directory, --workspace to skip the picker.
Add interactive workspace picker to headless server
Details
When starting without --workspace, the server now:
- Single workspace: auto-selects it
- Multiple workspaces: shows an interactive numbered menu
- No workspaces: offers to create one
- Non-interactive (piped stdin): uses active workspace or errors
Also lists available workspace names when --workspace doesn't match.
Get notified about new releases