Add IntentExecutedMessage for reverse-linking intent results
Details
New SDK message type broadcast after a successful intent execution,
allowing source plugins to create reverse links from the originating
entity to the newly created entity. This enables bidirectional linking
between e.g. a task and a calendar event created from that task's note.
SDK version 1.59.0 -> 1.59.1.
Add action buttons to AI intent suggestions and fix dismiss
Details
Intent suggestions from IntentEngine (e.g. "Create Calendar Event",
"Create Task") were rendered with only a "Dismiss" link and no action
button. The user had no way to accept/execute the suggested intent.
Three fixes:
1. AddIntentAsAssistantMessage now adds a primary action button using
the matched intent's DisplayName (e.g. "Create Calendar Event").
Clicking it calls IntentEngine.ExecuteAsync() which routes to the
owning plugin's IIntentProvider.ExecuteIntentAsync().
2. Fixed RemoveMessageBySuggestionId double-prefix bug — intent messages
have SuggestionId="intent:{uuid}" but the method was searching for
"intent:intent:{uuid}", so dismiss never actually removed the message.
3. Dismiss now calls IntentEngine.Dismiss() to clean up the pending
suggestion from the engine, not just the UI collection.
Also added IRecipient<ContentSuggestionActionRequestedMessage> to
AiSuggestionTrayViewModel to route intent action clicks through
ExecuteIntentActionAsync with proper loading/applied/error state
transitions.
Fix AI intent suggestions not appearing to user
Details
AiSuggestionTrayViewModel was lazily initialized (??= on first property
access), which meant the SuggestionAdded event subscription didn't exist
until the user opened the AI tray. Intent signals from plugins (email,
tasks, etc.) fired before the VM was created, so the balloon notification
and gold badge indicator never appeared — even though IntentEngine
correctly classified the intents.
Fixed by eagerly initializing AiTrayVM at the end of the
MainWindowViewModel constructor, ensuring the event subscription is
active before any plugin signals arrive.
Fix AI model selection not persisting across restarts
Details
The selected cloud model was being overwritten during settings load.
When LoadAiSettings set SelectedAiProvider, it triggered
OnSelectedAiProviderChanged which called RefreshAiCloudModels, which
defaulted SelectedAiCloudModel to the first model (Sonnet). This
fired OnSelectedAiCloudModelChanged which saved Sonnet to settings
before the actual saved model could be restored.
Fix: add _isLoadingAiSettings guard that suppresses all save calls
during LoadAiSettings. Change handlers now early-return when the
guard is active.
Also add a green "Saved" indicator below the model dropdown that
appears for 2 seconds after changing the model selection.
Downgrade cloud sync auto-start auth error to debug log
Details
CloudAuthError on auto-start is an expected condition (token expired, not yet
logged in). Log it at Debug level with a clean one-liner instead of Warning
with the full stack trace. Unexpected errors still get the full Warning + trace.
Get notified about new releases