Add data.generate_insights intent for AI-triggered dataset analysis
Details
Expose the existing insights generator pipeline as an intent so Duncan
can trigger exploratory data analysis when users ask to analyze, report
on, or generate insights from an embedded dataset. The intent fetches
sample data, pushes a loading suggestion card, and sends the
DatasetInsightRequestMessage to the shell's DatasetInsightOrchestrator
— the same pipeline used by the UI "Generate Insights" button.
Bump Data plugin version to 1.21.0.
Fix Duncan not initializing on app load due to vault timing
Details
The AI provider's IsConfigured check uses a synchronous vault read with
a 2-second timeout (GetApiKeySync). During DI resolution this runs before
EnsureStandardVaults has unlocked the ai-vault, so it times out and
returns false. Since IsEnabled is a plain computed property with no
re-notification, Duncan stays dead for the entire session.
Fix:
- AiService.RecheckAvailability() — called from the deferred background
services block after the vault is guaranteed unlocked. Re-evaluates the
provider's IsConfigured state.
- AiService.AvailabilityChanged event — fires when availability transitions.
- AiSuggestionTrayViewModel subscribes to AvailabilityChanged and re-raises
PropertyChanged for IsEnabled, which flips the UI visibility binding.
Notes: multi-image gallery for image blocks
Details
Replace the single-image ImageBlockEditor with a multi-image gallery
matching the Journal's photo section pattern. Key changes:
- Add ImagePhoto record, ImagePhotoLayout enum, extend ImageBlock with
Photos list and PhotoLayout property (backward-compatible — legacy
single-image blocks auto-migrate on load)
- New ImageLayoutBuilder: smart grid layouts (hero top/left/right, 2x2,
rows-of-3) with hover lift animation, rounded corners, and shadow
- New ImageLightbox: full-screen overlay with zoom (wheel, 0.5x–5x),
pan (drag when zoomed), navigation arrows, counter, double-tap reset
- Rewrite ImageBlockEditor: drop zone for empty state, multi-select
file picker, drag-to-reorder between cells, per-image remove button
on hover, layout picker for 3+ photos
- Add lightbox state and commands to NotesViewModel
- Update Markdown/PDF/DOCX export services to handle multi-image blocks
- Bump version to 1.64.0
Load .env file at startup for local development
Details
Adds a LoadDotEnv() helper that walks up from the executable directory
to find the nearest .env file and sets any missing environment variables.
This ensures PRIVSTACK_GITHUB_CLIENT_ID and other secrets are available
during local dev without requiring manual export or launchSettings.json.
Existing env vars are never overwritten.
Fix DOCX export crash: copy NuGet dependencies to output
Details
Add CopyLocalLockFileAssemblies to the Notes plugin csproj. Without
this, NuGet dependencies like DocumentFormat.OpenXml and QuestPDF were
not copied to the build output. When the PluginLoadContext's
AssemblyDependencyResolver tried to resolve them at runtime, it failed
with FileNotFoundException because there's no runtimeconfig.json to
probe the NuGet cache.
This matches the pattern used by PrivStack.Plugin.Journal which also
has plugin-specific NuGet dependencies.
Get notified about new releases