Add cloud-aware chat with conversation history and persistent memory
Details
Cloud providers (OpenAI, Anthropic, Gemini) now build full message arrays from
ConversationHistory when present, enabling multi-turn conversations. Anthropic
uses automatic prompt caching (cache_control ephemeral) for multi-turn chats,
reducing repeat input cost to 10% on cache hits. AiPersona gains a richer
cloud system prompt with memory context injection and higher token budgets.
AiMemoryService persists learned user facts to JSON at DataPaths.BaseDir,
capped at 50 entries. AiMemoryExtractor runs a fire-and-forget secondary AI
call after cloud responses to extract memorable facts. The chat VM branches:
local models get the existing minimal prompt path; cloud models get history,
memory, and no aggressive sanitization. Desktop version bumped to 1.51.0.
Add AiChatMessage record and ConversationHistory to AiRequest
Details
Introduces AiChatMessage (Role + Content) and an optional ConversationHistory
property on AiRequest for multi-turn chat support. Cloud providers can iterate
over the history to build full message arrays while local providers ignore it.
Backward-compatible — defaults to null. SDK version bumped to 1.51.0.
Convert AI tray from flat card list to conversation chat interface
Details
Redesign the AI suggestion tray as a chat-style conversation UI with user/assistant
message bubbles. User actions (Summarize, Rewrite) appear as right-aligned user bubbles
with clickable source entity links, followed by left-aligned assistant response bubbles
with loading states, content, and action buttons.
Key changes:
- Add UserPromptLabel to ContentSuggestionCard SDK model for user bubble text
- New AiChatMessageViewModel with User/Assistant roles, state management, and actions
- Refactor AiSuggestionTrayViewModel to use Messages collection instead of Cards
- Add free-form chat input with AiSuggestionTrayViewModel.Chat.cs partial class
- Rewrite AiSuggestionTray.axaml with chat bubble layout, auto-scroll, Enter-to-send
- Wire NavigateToLinkedItemFunc for clickable source links in bubbles
- Fix text overflow: all content uses TextWrapping="Wrap" instead of TextTrimming
- Rename tray header from "AI Suggestions" to "PrivStack AI"
- Mark old IAiTrayCardViewModel and ContentSuggestionCardViewModel as [Obsolete]
- Bump SDK to 1.50.0, Desktop to 1.50.0
Unified global AI suggestion tray replacing IntentSuggestionTray (v1.49.0)
Details
Merges the shell's intent suggestion tray and plugin-local AI panels into a
single global "AI Suggestions" tray owned by the desktop shell.
New files:
- AiSuggestionServiceImpl: wraps WeakReferenceMessenger for Push/Update/Remove
- AiSuggestionTrayViewModel: subscribes to IntentEngine events + content
suggestion messages, aggregates both card types into one ObservableCollection
- ContentSuggestionCardViewModel: wraps ContentSuggestionCard, sends
ActionRequested/Dismissed messages back to owning plugin
- IAiTrayCardViewModel: common interface for Intent and Content card VMs
- AiSuggestionTray.axaml: DataTemplate-based rendering for both card types
Removed:
- IntentSuggestionTrayViewModel (replaced by AiSuggestionTrayViewModel)
- IntentSuggestionTray.axaml (replaced by AiSuggestionTray.axaml)
Renamed in MainWindowViewModel:
- IntentTrayVM → AiTrayVM, IsIntentTrayOpen → IsAiTrayOpen
- ToggleIntentTray → ToggleAiTray
Updated MainWindow.axaml bindings, Keyboard.cs escape handler, PluginHost/
PluginHostFactory wiring, and ServiceRegistration DI container.
Desktop version 1.48.3 → 1.49.0.
Add IAiSuggestionService SDK types for unified AI tray (v1.49.0)
Details
Introduces the SDK contract for the global AI suggestion tray:
- ContentSuggestionCard, SuggestionAction, ContentSuggestionState models
- Messenger messages: Push/Update/Remove/ActionRequested/Dismissed
- IAiSuggestionService interface (Push, Update, Remove)
- IPluginHost.Suggestions property for plugin access
- SDK version bump 1.48.0 → 1.49.0
Plugins can now push content suggestion cards (summaries, rewrites, etc.)
into a shell-owned unified tray via Host.Suggestions. Action clicks route
back to the owning plugin via ContentSuggestionActionRequestedMessage on
the messenger bus, keeping block-level operations inside the plugin while
the shell renders cards uniformly alongside intent suggestion cards.
Get notified about new releases